学习笔记之java.io包中的字符流(上)—— Reader和Writer

来源:互联网 发布:大韩帝国知乎 编辑:程序博客网 时间:2024/05/17 23:47

在Bruce Eckel的第四版《Thinking in Java》中介绍Reader和Writer时曾提到,JDK在java.io包中引入了Reader和Writer,并不是要替代1.0中的InputStream和OutputStream,而是为了更好的使用IO,实现国际化(internationalization)。说得直白一些,其实就是我们具体应用中所需IO更多的是字符而非字节,Reader和Writer实现中增加了字符编码解码的机制,把字节流转为字符流,更加方便开发使用。

从Reader的源码实现中我们看到,和InputStream类似,Reader也是抽象类(而非interface),同时提供的方法也和InputStream非常相似。Reader之所以是抽象类,主要是由于下面这个方法没有实现,需要子类提供:

1
abstractpublic int read(charcbuf[], intoff, intlen) throwsIOException;

同理,Writer的也是:

1
abstractpublic void write(charcbuf[], intoff, intlen) throwsIOException;

另外,在Reader和Writer的源码中,我们还可以看到在JDK1.5之后增加了许多对NIO的支持。比如类的声明中增加了Readable、Appendable接口等。

细节可参考JDK或者Oracle的API:

http://docs.oracle.com/javase/7/docs/api/java/io/package-summary.html

1. Reader/Writer具体的实现类分析

和InputStream和OutputStream的类似,Reader和Writer也有很多子类,他们分别和InputStream和OutputStream的子类对应,但类层次关系并不完全一样。

原始的Reader和Writer类:

  • CharArrayReader/CharArrayWriter 相当于InputStream和OutputStream中的ByteArrayInputStream和ByteArrayOutputStream
  • PipedReader/PipedWriter 对应PipedInputStream和PipedOutputStream
  • StringReader和StringWriter 和StringBufferInputStream有所类似

而经过“装饰”包装的,还有如下几个:

  • FilterReader/FilterWriter对应FilterInputStream和FilterOutputStream
  • BufferedReader/BufferedWriter 对应BufferedInputStream/BufferedOutputStream
  • LineNumberReader 对应LineNumberInputStream
  • PushbackReader 对应PushbackInputStream
  • PrintWriter 对应PrintStream

功能逻辑上基本都是和字节流一致的,就不一一介绍了。

2. FileReader/FileWriter和InputStreamReader/OutputStreamWriter

FileReader/FileWriter分别是InputStreamReader/OutputStreamWriter的子类。


0 0
原创粉丝点击