InputSteream和OutpurStream是针对基于字节(byte)输入输出设计的,实际应用中常常需要读写的是基于字符(char ,Unicode 2个字节)的,java.io.Reader和java.io.Writer就是所有读写字符数据流的父类。
Reader提供的方法和InputStream提供的几乎是一样的,不同之处在于Reader的操作多数是char类型的。
对上图(从下往上看)总结说明如下:
- Reader类中定义了成员变量lock,顾名思义,lock的用途是解决实现对流操作的同步问题。Reader的子类可以使用这个成员变量来实现流操作的同步操作。
- F ilterReader也是采用了Decorator(装饰)模式,与我们在前面学习InputStream、OutputStream相比较,如下图所示:前面的BufferedInputStream、BufferedOutputStream都是采用了Decorator(装饰)模式,而这里的BufferedReader是直接从Reader继承下来了,而不是从F ilterReader继承的,不符合Decorator(装饰)模式据说这个JAVA SDK中的一个BUG,但是好像一直也没有修改,估计对使用没有大的影响吧。此外BufferedReader还提供了一个String readLine()函数,方便我们从文件中读取一行数据,这个函数也是比较有用的。
- InputStreamReader就像是一个桥:把字节流(byte)转换为字符流(char),它读取字节流,并使用指定的字符集(charset)将这些字节流转换为字符。常见的字符集有:GBK、ISO-8859-1、UTF-8,Java的字符流本身采用的就是Unicode,关于字符集的详细说明请看文档。给大家举个具体的例子,如下:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String strLine;
while(strLine=in.readline()!=null)
{
if(strLine.contain("分隔符")){
System.out.println(strLine)
}
}
in.close();
具体的含义就是:将标准输入流转换为字符流,并缓存到BufferedReader的缓冲区中,并将缓冲区中的数据显示在标准输出设备上。
- StringReader、CharArrayReader使用起来都非常简单;
总结说明
Reader子类中较常用的还是:BufferedInputStream、InputStreamReader,BufferedInputStream为我们提供了数据缓存机制,对于读取大块的数据比较方便,尤其是在读取文件的时候;InputStreamReader作为流的转换,转换后的字符流是什么编码,与虚拟机默认的字符集有关,关于字符集部分大家还需要去深入学习。