首页 > 代码库 > Java I/O
Java I/O
Java流在处理上分为字符流和字节流。字符流处理的单元是2个字节的Unicode字符,操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
以字节为单位的Stream:InputStream、OutputStream
InputStream,此抽象类是字节输入流的所有类的超类(把xxx作为输入的来源,从中读取数据)。OutputStream,此抽象类是输出字节流的所有类的超类,输出流接受输出字节并将这些字节发送到某个接收器。操作对象是字节(或字节数组),所以String需要调用getBytes()转换后才能进行操作。操作的时候,可以选择一个字节一个字节的操作,也可以选择多个字节一起操作。
ByteArrayInputStream --- 把内存中的一个缓冲区作为InputStream使用FileInputStream --- 把一个文件作为InputStream,实现对文件的读取操作
StringBufferInputStream --- 把一个String 对象作为 InputStream
PipedInputStream --- 实现了 pipe 的概念,管道输入流是指一个通讯管道的接收端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
ByteArrayOutputStream --- 把信息存入内存中的一个缓冲区中,该类实现一个以字节数组形式写入数据的输出流
FileOutputStream --- 文件输出流是向File或FileDescriptor输出数据的一个输出流
以字符为单位向的Stream:Reader、Writer
CharArrayReader --- 与ByteArrayInputStream对应,此类实现一个可用作字符输入流的字符缓冲区StringReader --- 与StringBufferInputStream对应,其源为一个字符串的字符流
FileReader --- 与FileInputStream 对应
转换:InputStreamReader、OutputStreamReader
把一个以字节为导向的stream转换成一个以字符为导向的stream。InputStreamReader类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流(编码方式可以指定,或使用平台默认的编码方式)。为了达到更高效率,考虑用BufferedReader封装:BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
考虑的顺序:数据格式(字节/字符)→输入/输出→是否需要转换→数据来源/去向(文件、Byte[]、Char[]、String)→是否需要缓冲(需要BufferedInputStream/BufferedReader)→是否需要格式化输出(需要PrintStream/PrintWriter)
字节流和字符流的区别
实际上字节流在操作的时候本身是不会用到缓冲区的,是文件本身直接操作的,但是字符流在操作的时候是会用到缓冲区的,是通过缓冲区来操作文件的。如果将字节流和字符流程序关闭文件的代码注释掉,你会发现使用字节流的话,写入后文件中内容就存在了,但是使用字符流的话,文件中还是没有内容的,需要刷新缓冲区才会有。
字节流和字符流哪个更好?
答案是字节流。因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容,字符是在内存中形成的。
文件I/O实践,File fileName = new File("xxx"); InputStream in = new FileInputStream(fileName); 然后就可以调用FileInputStream的一系列方法。