参考:http://blog.youkuaiyun.com/ilibaba/article/details/3955799
Java流在处理上分为字符流和字节流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
Java内用Unicode编码存储字符,字符流处理类负责将外部的其他编码的字符流和java内Unicode字符流之间的转换。而类InputStreamReader和OutputStreamWriter处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
一、以字节为导向的stream - InputStream/OutputStream
InputStream和OutputStream是两个abstact类,对于字节为导向的stream都扩展这两个基类;
1. InputStream
FileInputStream:把一个文件作为InputStream,实现对文件的读取操作。
PipedInputStream:实现了pipe的概念,主要在线程中使用,管道输入流是指一个通讯管道的接收端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用。
SequenceInputStream:把多个InputStream合并为一个InputStream。“序列输入流”类允许应用程序把几个输入流连续地合并起来,并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾。然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。
StringBufferInputStream:把一个String对象作为InputStream。
注释:不推荐使用StringBufferInputStream方法。此类不能将字符正确的转换为字节。
同JDK1.1版中的类似,从一个串创建一个流的最佳方法是采用StringReader类。
2. OutputSteam
FileOutputStream:文件输出流是向File或FileDescriptor输出数据的一个输出流。
PipedOutputStream:管道输出流是指一个通讯管道的发送端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
ByteArrayOutputStream:把信息存入内存中的一个缓冲区中。该类实现一个以字节数组形式写入数据的输出流。当数据写入缓冲区时,它自动扩大。用toByteArray()和toString()能检索数据。
二、以字符为导向的stream - Reader/Writer
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。
Reader/Writer为abstact类
以Unicode字符为导向的stream包括下面几种类型:
1. Reader
CharArrayReader:与ByteArrayInputStream对应此类实现一个可用作字符输入流的字符缓冲区。
StringReader:与StringBufferInputStream对应其源为一个字符串的字符流。
2. Writer
三、JavaIO的一般使用原则
1. 按数据来源(去向)分类:
1) 是文件:FileInputStream,FileOutputStream,(字节流)FileReader,FileWriter(字符)
2) 是byte[]:ByteArrayInputStream,ByteArrayOutputStream(字节流)
3) 是Char[]:CharArrayReader,CharArrayWriter(字符流)
4) 是String:StringBufferInputStream,StringBufferOuputStream(字节流)StringReader,StringWriter(字符流)
5) 网络数据流:InputStream,OutputStream,(字节流)Reader,Writer(字符流)
2. 按是否格式化输出分:
1) 要格式化输出:PrintStream,PrintWriter
3. 按是否要缓冲分:
1) 要缓冲:BufferedInputStream,BufferedOutputStream,(字节流)BufferedReader,BufferedWriter(字符流)
4. 按数据格式分:
1) 二进制格式(只要不能确定是纯文本的):InputStream,OutputStream及其所有带Stream结束的子类
2) 纯文本格式(含纯英文与汉字或其他编码方式);Reader,Writer及其所有带Reader,Writer的子类
5. 按输入输出分:
1) 输入:Reader,InputStream类型的子类
2) 输出:Writer,OutputStream类型的子类
6. 特殊需要:
1) 从Stream到Reader,Writer的转换类:InputStreamReader,OutputStreamWriter
2) 对象输入输出:ObjectInputStream,ObjectOutputStream
3) 进程间通信:PipeInputStream,PipeOutputStream,PipeReader,PipeWriter
4) 合并输入:SequenceInputStream
5) 更特殊的需要:PushbackInputStream,PushbackReader,LineNumberInputStream,LineNumberReader