![Java核心技术·卷Ⅱ:高级特性(原书第10版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/937/34339937/b_34339937.jpg)
2.1.2 完整的流家族
与C语言只有单一类型FILE*包打天下不同,Java拥有一个流家族,包含各种输入/输出流类型,其数量超过60个!请参见图2-1和图2-2。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/2a1-i.jpg?sign=1738832079-ZWfdQs9Kx7IrDGMVm5TNBeVrY4WOMiHw-0-db31ccd83cc071ea365f7ca348951e06)
图2-1 输入流与输出流的层次结构
让我们把输入/输出流家族中的成员按照它们的使用方法来进行划分,这样就形成了处理字节和字符的两个单独的层次结构。正如所见,InputStream和OutputStream类可以读写单个字节或字节数组,这些类构成了图2-1所示的层次结构的基础。要想读写字符串和数字,就需要功能更强大的子类,例如,DataInputStream和DataOutputStream可以以二进制格式读写所有的基本Java类型。最后,还包含了多个很有用的输入/输出流,例如,ZipInputStream和ZipOutputStream可以以常见的ZIP压缩格式读写文件。
另一方面,对于Unicode文本,可以使用抽象类Reader和Writer的子类(请参见图2-2)。Reader和Writer类的基本方法与InputStream和OutputStream中的方法类似。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/043-i.jpg?sign=1738832079-6awMdob9YBdEvzpy1jCKIYgj0DVeas39-0-6150d25d78b452dadc0c3a4015e2662e)
read方法将返回一个Unicode码元(一个在0~65535之间的整数),或者在碰到文件结尾时返回-1。write方法在被调用时,需要传递一个Unicode码元(请查看卷Ⅰ第3章有关Unicode码元的讨论)。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/2a2-i.jpg?sign=1738832079-W3vqUvv1PAy03chrTZu8B62MEPlwg7Gz-0-8b0f115bdc63b22cc86ba90e45ac7dd7)
图2-2 Reader和Writer的层次结构
还有4个附加的接口:Closeable、Flushable、Readable和Appendable(请查看图2-3)。前两个接口非常简单,它们分别拥有下面的方法:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/044-i.jpg?sign=1738832079-gFhBbGHQhmAtp9rOLYEHrKVlfEX0Z32M-0-a6a94a3c9572b864c877321ab18a3d0c)
和
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/044-2-i.jpg?sign=1738832079-vS6T19OqprUIU7titI5RJ8BvKn6KEsUi-0-bfe823b64f3c807f9c5ab906c4a566f1)
InputStream、OutputStream、Reader和Writer都实现了Closeable接口。
注意:java.io.Closeable接口扩展了java.lang.AutoCloseable接口。因此,对任何Closeable进行操作时,都可以使用try-with-resource语句(try-with-resource语句是指声明了一个或多个资源的try语句——译者注)。为什么要有两个接口呢?因为Closeable接口的close方法只抛出IOException,而AutoCloseable.close方法可以抛出任何异常。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/2a3-i.jpg?sign=1738832079-ORYjSoaHHAcqY5pkBelVpu6d6Ru7ilF8-0-abb494233a54f9887d4b6bd5d94849b6)
图2-3 Closeable、Flushable、Readable和Appendable接口
而OutputStream和Writer还实现了Flushable接口。
Readable接口只有一个方法:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/044-3-i.jpg?sign=1738832079-EeHw5vGx4KbcTlIVv378yebWRYPOFHz8-0-184adb4899dc6bd7491de2970a17b449)
CharBuffer类拥有按顺序和随机地进行读写访问的方法,它表示一个内存中的缓冲区或者一个内存映像的文件(请参见2.6.2节以了解细节)。
Appendable接口有两个用于添加单个字符和字符序列的方法:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/045-i.jpg?sign=1738832079-cIg4hrhG99njNNYZYn3SOfhWT63oPwzb-0-da45e59ade8cd1e77ef10dd6674d8b0d)
CharSequence接口描述了一个char值序列的基本属性,String、CharBuffer、StringBuilder和StringBuffer都实现了它。
在流类的家族中,只有Writer实现了Appendable。
java.io.Closeable 5.0
·void close()
关闭这个Closeable,这个方法可能会抛出IOException。
java.io.Flushable 5.0
·void flush()
冲刷这个Flushable。
java.lang.Readable 5.0
·int read(CharBuffer cb)
尝试着向cb读入其可持有数量的char值。返回读入的char值的数量,或者当从这个Readable中无法再获得更多的值时返回-1。
java.lang.Appendable 5.0
·Appendable append(char c)
·Appendable append(CharSequence cs)
向这个Appendable中追加给定的码元或者给定的序列中的所有码元,返回this。
java.lang.CharSequence 1.4
·char charAt(int index)
返回给定索引处的码元。
·int length()
返回在这个序列中的码元的数量。
·CharSequence subSequence(int startIndex,int endIndex)
返回由存储在startIndex到endIndex-1处的所有码元构成的CharSequence。
·String toString()
返回这个序列中所有码元构成的字符串。