1 流的概念 stream 代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样,如下图: 在 Java 的IO 中,所有的stream(包括 Inputstream 和 Out stream)都包括两种类型: (1)字节流 表示以字节为单位从 stream 中读取或往 stream 中写入信息,即 io 包中的inputstream 类和 outputstream 类的派生类。通常用来读取二进制数据,如图象和声音。 (2)字符流 以 Unicode 字符为导向的stream,表示以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。 区别: Reader 和 Writer 要解决的,最主要的问题就是国际化。原先的I/O 类库只支持 8 位的字节流,因此不可能很好地处理 16 位的Unicode 字符流。Unicode 是国际化的字符集(更何况 Java 内置的char 就是16 位的Unicode字符),这样加了 Reader 和 Writer 之后,所有的I/O 就都支持 Unicode 了。此外新类库的性能也比旧的好。 但是,Read 和 Write 并不是取代InputStream 和 OutputStream,有时,你还必须同时使用"基于 byte 的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader 负责将 InputStream 转化成Reader,而 OutputStreamWriter 则将 OutputStream 转化成 Writer。实际上是通过 byte[]和 String 来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。 以字符为导向的stream 基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,只是在操作时的导向不同。如 CharArrayReader 和ByteArrayInputStream 的作用都是把内存中的一个缓冲区作为InputStream 使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。 字符流处理的单元为2 个字节的Unicode 字符,分别操作字符、字符数组或字符串;而字节流处理单元为1 个字节,操作字节和字节数组,可用于任何类型的对象,包括二进制对象,但是不能直接处理Unicode 字符。字符流是由Java 虚拟机将字节转化为2 个字节的Unicode 字符为单位的字符而成的,所以它对...