Java I/O总结——Reader

来源:互联网 发布:独立游戏开发入门 知乎 编辑:程序博客网 时间:2024/05/20 23:03

InputSteream和OutpurStream是针对基于字节(byte)输入输出设计的,实际应用中常常需要读写的是基于字符(char ,Unicode 2个字节)的,java.io.Reader和java.io.Writer就是所有读写字符数据流的父类。

Reader提供的方法和InputStream提供的几乎是一样的,不同之处在于Reader的操作多数是char类型的。

Reader

对上图(从下往上看)总结说明如下:

  • Reader类中定义了成员变量lock,顾名思义,lock的用途是解决实现对流操作的同步问题。Reader的子类可以使用这个成员变量来实现流操作的同步操作。
  • F ilterReader也是采用了Decorator(装饰)模式,与我们在前面学习InputStream、OutputStream相比较,如下图所示:BufferedReader比较前面的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作为流的转换,转换后的字符流是什么编码,与虚拟机默认的字符集有关,关于字符集部分大家还需要去深入学习。

原创粉丝点击