您的位置:首页 > 编程语言 > Java开发

java中Writer、Reader、OutputStream、InputStream 区别与联系之Reader篇

2012-08-15 19:57 471 查看
InputStereamOutpurStream是针对基于字节(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)

{

System.out.println(strLine);

}

in.close();

具体的含义就是:将标准输入流转换为字符流,并缓存到BufferedReader的缓冲区中,并将缓冲区中的数据显示在标准输出设备上。
StringReader、CharArrayReader使用起来都非常简单;

总结说明

Reader子类中较常用的还是:BufferedInputStream、InputStreamReader,BufferedInputStream为我们提供了数据缓存机制,对于读取大块的数据比较方便,尤其是在读取文件的时候;InputStreamReader作为流的转换,转换后的字符流是什么编码,与虚拟机默认的字符集有关,关于字符集部分大家还需要去深入学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐