Java流在处理上分为字符流和字节流。字符流处理的单元是2个字节的Unicode字符,操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
以字节为单位的Stream:InputStream、OutputStream
InputStream,此抽象类是字节输入流的所有类的超类(把xxx作为输入的来源,从中读取数据)。OutputStream,此抽象类是输出字节流的所有类的超类,输出流接受输出字节并将这些字节发送到某个接收器。操作对象是字节(或字节数组),所以String需要调用getBytes()转换后才能进行操作。操作的时候,可以选择一个字节一个字节的操作,也可以选择多个字节一起操作。
ByteArrayInputStream --- 把内存中的一个缓冲区作为InputStream使用以字符为单位向的Stream:Reader、Writer
CharArrayReader --- 与ByteArrayInputStream对应,此类实现一个可用作字符输入流的字符缓冲区转换:InputStreamReader、OutputStreamReader
把一个以字节为导向的stream转换成一个以字符为导向的stream。考虑的顺序:数据格式(字节/字符)→输入/输出→是否需要转换→数据来源/去向(文件、Byte[]、Char[]、String)→是否需要缓冲(需要BufferedInputStream/BufferedReader)→是否需要格式化输出(需要PrintStream/PrintWriter)
字节流和字符流的区别
实际上字节流在操作的时候本身是不会用到缓冲区的,是文件本身直接操作的,但是字符流在操作的时候是会用到缓冲区的,是通过缓冲区来操作文件的。如果将字节流和字符流程序关闭文件的代码注释掉,你会发现使用字节流的话,写入后文件中内容就存在了,但是使用字符流的话,文件中还是没有内容的,需要刷新缓冲区才会有。
字节流和字符流哪个更好?
答案是字节流。因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容,字符是在内存中形成的。
文件I/O实践,File fileName = new File("xxx"); InputStream in = new FileInputStream(fileName); 然后就可以调用FileInputStream的一系列方法。
原文:http://blog.csdn.net/luopeng123456789/article/details/25617769