java.io包中的字符流(上)—— Reader和Writer

随着时间的推移,Sun的JDK从1.0版本开始,又进入了1.1时代。在JDK1.1中,Java IO又新增了两个重要的内容,就是java.io包中的Reader和Writer两个类。相对于InputStream和OutputStream的字节流,我们可以通常称Reader和Writer为字符流,本篇文章我们就来看一下Reader和Writer以及他们的子类。

o. Reader和Writer

在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之所以是抽象类,主要是由于下面这个方法没有实现,需要子类提供:

abstract public int read(char cbuf[], int off, int len) throws IOException;

同理,Writer的也是:

abstract public void write(char cbuf[], int off, int len) throws IOException;

另外,在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的子类。

这具体的要涉及到和InputStream/OutputStream的适配机制,尤其还有FileReader/FileWriter中处理字符编码、解码的entire,下篇文章详细介绍。

作者原创,难免有错误,欢迎读者热心评论留言指出,以免误导他人,谢谢!

此条目发表在 IO, Java, Java语言, 开发, 计算机技术 分类目录,贴了 , , , , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>