转载请注明源出处:http://www.cnblogs.com/lighten/p/7071733.html
1.前言
之前的章节已经将Java8的io包中的字节流介绍完毕了。本章开始介绍Java的IO中另一个重要的体系,字符流。字节是给计算机看的,字符才是人能够认识的,可想而知字符流的重要性。字符流体系的根源在于抽象父类Reader和Writer。一切都起源于这两个类。
2.Reader
Reader实现了Readable和Closeable接口,这两个接口从JDK1.5开始出现。Reader的结构其实和InputStream很像,如下:
稍有不同的地方就是:lock对象锁和read(CharBuffer)这个Readable接口需要实现的方法,ready()对比于InputStream中的available()了。lock是一个Object对象,其作用是用于流中的同步操作,为了高效通常使用其它的对象,而不是流对象本身(this。同步锁使用this对象效率会差?Get一个新的知识点了)。Reader与InputStream最大的不同就在于Reader需要子类实现的方法是read(char[], int, int),InputStream是read()。这也很好理解,因为Reader字符流更关注的是字符,可以是多个字节,InputStream关注的是字节,所以是需要实现read()方法。
通过read(char[], int, int)方法,读取一个字符数组,存入所给的CharBuffer中。
read()也是借助了read(char[],int, int)方法。
maxSkipBufferSize默认是8192,所以一次最多跳过这么多个字符。其它的放啊就是不支持重置,close方法要自己处理了。
3.Writer
Writer的差异与OutputStream就大不相同了,结构如下:
其需要实现的方法就是write(char[],int,int),flush()和close()方法。append方法都来自于其实现的Appendable接口。默认的WRITE_BUFFER_SIZE是1024个。
实现都比较简单,看一下就能看明白的,这里不做详细描述。上面的结构也能看出其针对的就是字符流了。写都是字符或字符串。append方法其实也是调用了这些方法。