可将 Java 库的 IO 类分割为输入与输出两个部分,通过继承,从 InputStream(输入流)衍生的所有类都拥有名为 read()的基本方法,用于读取单个字节或者字节数组。类似地,从 OutputStream 衍生的所有类都拥有基本方法write(),用于写入单个字节或者字节数组。然而,我们通常不会用到这些方法;它们之所以存在,是因为更复杂的类可以利用它们,以便提供一个更有用的接口。因此,我们很少用单个类创建自己的系统对象。一般情况下,我们都是将多个对象重叠在一起,提供自己期望的功能。我们之所以感到 Java 的流库( Stream Library)异常复杂,正是由于为了创建单独一个结果流,却需要创建多个对象的缘故。很有必要按照功能对类进行分类。库的设计者首先决定与输入有关的所有类都从 InputStream 继承,而与输出有关的所有类都从 OutputStream 继承。
1.InputStream的类型
(1) 字节数组
(2) String 对象
(3) 文件
(4) “管道”,它的工作原理与现实生活中的管道类似:将一些东西置入一端,它们在另一端出来。
(6) 其他起源地,如 Internet 连接等(将在本书后面的部分讲述)。
除此以外, FilterInputStream 也属于 InputStream 的一种类型,用它可为“破坏器”类提供一个基础类,
以便将属性或者有用的接口同输入流连接到一起。这将在以后讨论。
类 |
功能 |
构造器参数/如何使用 |
ByteArrayInputStream |
允许内存中的一个缓冲区作为 InputStream 使用,从中提取字节的缓冲区 |
作为一个数据源使用。通过将其同一个 FilterInputStream 对象连接,可提供一个有用的接口 |
StringBufferInputStream |
将一个 String 转换成 InputStream 一个 String(字串),基础的实施方案实际采用一个 StringBuffer(字串缓冲) |
作为一个数据源使用。通过将其同一个 FilterInputStream 对象连接,可提供一个有用的接口 |
FileInputStream |
用于从文件读取信息 代表文件名的一个 String,或者一个 File 或 FileDescriptor 对象 |
作为一个数据源使用。通过将其同一个 FilterInputStream 对象连接,可提供一个有用的接口 |
PipedInputStream |
产生为相关的 PipedOutputStream 写的数据 |
实现了“管道化”的概念 |
PipedOutputStream |
作为一个数据源使用 |
通过将其同一个 FilterInputStream 对象连接,可提供一个有用的接口 |
SequenceInputStream |
将两个或更多的 InputStream 对象转换成单个 InputStream 使用 两个InputStream 对象或者一个 Enumeration,用于 InputStream 对象的一个容器 |
作为一个数据源使用。通过将其同一个FilterInputStream 对象连接,可提供一个有用的接口 |
FilterInputStream |
对作为破坏器接口使用的类进行抽象 |
那个破坏器为其他 InputStream 类提供了有用的功能 |
2.OutputStream的类型
类 |
功能 |
构造器参数/如何使用 |
ByteArrayOutputStream |
在内存中创建一个缓冲区。我们发送给流的所有数据都会置入这个缓冲区。可选缓冲区的初始大小 |
用于指出数据的目的地。若将其同FilterOutputStream 对象连接到一起,可提供一个有用的接口 |
FileOutputStream |
将信息发给一个文件 用一个 String 代表文件名,或选用一个 File或FileDescriptor对象 |
作为一个数据源使用。通过将其同一个FilterInputStream 对象连接,可提供一个有用的接口 |
PipedOutputStream |
我们写给它的任何信息都会自动成为相关的PipedInputStream的输出。实现了“管道化”的概念PipedInputStream |
为多线程处理指出自己数据的目的地/将其同FilterOutputStream 对象连接到一起,便可提供一个有用的接口 |
FilterOutputStream |
对作为破坏器接口使用的类进行抽象处理 |
那个破坏器为其他 InputStream 类提供了有用的功能 |