Java的IO体系分为Input/Output和Reader/Writer两类,区别在于Reader/Writer在读写文本时能自动转换内码。基本上,所有的IO类多是配对的,即有XXXInput,就有一个对应的XXXOutput。
Java的输入输入操作是基于数据流(Stream)的,有序的字节或者字符通过一个通信信道从源地址传送到目的地址。Java支持两个数据流:InputStream和OutputStream。这两个数据流又可以分为许多子类来完成IO功能。Java1.1版本正式加入了Reader和Writer两个类,支持Java IO的国际化标准,并通过国际化字符编码(Unicode)将文本存储起来。
简要的Java 的IO类图如下:
Reader类类似于InputStream类,它是输入类层次中的基础,Reader支持16位的eUnicode字符输出,而InputStream只支持8位字符输出
FilerReader与FileInputStream类的区别
FileInputStream是以字节流方式读取,FileReader是把文件转换为字符流读入。InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出来的是char数组或者String,使用InputStream读取出来的是byte数组。
Reader类及其子类提供的字符流读取char(16位,unicode编码),inputStream及其子类提供字节流读取byte(8位),所以FileReader类是将文件按字符流的方式读取,FileInputStream则是按字节流的方式读取文件。
InputStreamReader和BufferReader可以在构造器中重新指定编码方式,如果不指定的话,将采用底层操作系统的默认编码方式,例如GBK
FileReader与InputStreamReader涉及编码转换,可能在不同平台上出现乱码现象,而FileInputStream以二进制方式处理,不会出现乱码。