在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
|
abstract
public
int
read(
char
cbuf[],
int
off,
int
len)
throws
IOException;
|
同理,Writer的也是:
1
|
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的子类。