diff --git a/docs/book/Appendix-IO-Streams.md b/docs/book/Appendix-IO-Streams.md index b662009..d6e00cf 100644 --- a/docs/book/Appendix-IO-Streams.md +++ b/docs/book/Appendix-IO-Streams.md @@ -30,7 +30,7 @@ I/O 流屏蔽了实际的 I/O 设备中处理数据的细节: ## 输入流类型 -`InputStream` 表示那些从不同数据源产生输入的类,这些数据源包括: +`InputStream` 表示那些从不同数据源产生输入的类,如[表 I/O-1](#table-io-1) 所示,这些数据源包括: 1. 字节数组; 2. `String` 对象; @@ -41,7 +41,7 @@ I/O 流屏蔽了实际的 I/O 设备中处理数据的细节: 每种数据源都有相应的 `InputStream` 子类。另外,`FilterInputStream` 也属于一种 `InputStream`,它的作用是为“装饰器”类提供基类。其中,“装饰器”类可以把属性或有用的接口与输入流连接在一起,这个我们稍后在讨论。 -**表 I/O-1:`InputStream` 类型** +**表 I/O-1:`InputStream` 类型** | 类 | 功能 | 构造器参数 | 如何使用 | | :--: | :-- | :-------- | :----- | @@ -55,7 +55,11 @@ I/O 流屏蔽了实际的 I/O 设备中处理数据的细节: ## 输出流类型 -**表 I/O-2:`OutputStream` 类型** +如[表 I/O-2](#table-io-2) 所示,该类别的类决定了输出所要去往的目标:字节数组(但不是 `String`,当然,你可以用字节数组自己创建)、文件或管道。 + +另外,`FilterOutputStream` 为“装饰器”类提供了一个基类,“装饰器”类把属性或者有用的接口与输出流连接了起来,这些稍后会讨论。 + +**表 I/O-2:`OutputStream` 类型** | 类 | 功能 | 构造器参数 | 如何使用 | | :--: | :-- | :-------- | :----- | @@ -71,26 +75,27 @@ I/O 流屏蔽了实际的 I/O 设备中处理数据的细节: ### 通过 `FilterInputStream` 从 `InputStream` 读取 -**表 I/O-3:`FilterInputStream` 类型** +**表 I/O-3:`FilterInputStream` 类型** | 类 | 功能 | 构造器参数 | 如何使用 | | :--: | :-- | :-------- | :----- | -| `DataInputStream` | | | | -| `BufferedInputStream` | | | | -| `LineNumberInputStream` | | | | -| `PushbackInputStream` | | | | +| `DataInputStream` | 与 `DataOutputStream` 搭配使用,按照移植方式从流读取基本数据类型(`int`、`char`、`long` 等) | `InputStream` | 包含用于读取基本类型数据的全部接口 | +| `BufferedInputStream` | 使用它可以防止每次读取时都得进行实际写操作。代表“使用缓冲区” | `InputStream`,可以指定缓冲区大小(可选) | 本质上不提供接口,只是向进程添加缓冲功能。与接口对象搭配 | +| `LineNumberInputStream` | 跟踪输入流中的行号,可调用 `getLineNumber()` 和 `setLineNumber(int)` | `InputStream` | 仅增加了行号,因此可能要与接口对象搭配使用 | +| `PushbackInputStream` | 具有能弹出一个字节的缓冲区,因此可以将读到的最后一个字符回退 | `InputStream` | 通常作为编译器的扫描器,我们可能永远也不会用到 | ### 通过 `FilterOutputStream` 向 `OutputStream` 写入 -**表 I/O-4:`FilterOutputStream` 类型** +**表 I/O-4:`FilterOutputStream` 类型** | 类 | 功能 | 构造器参数 | 如何使用 | | :--: | :-- | :-------- | :----- | -| `DataOutputStream` | | | | -| `PrintStream` | | | | -| `BufferedOutputStream` | | | | +| `DataOutputStream` | 与 `DataInputStream` 搭配使用,因此可以按照一直方式向流中写入基本类型数据(`int`、`char`、`long` 等) | `OutputStream` | | +| `PrintStream` | 用于产生格式化输出。其中 `DataOutputStream` 处理数据的存储,`PrintOutputStream` 处理显示 | `OutputStream`,可以用 `boolean` 值指示是都每次换行时清空缓冲区(可选) | 应该是对 `OutputStream` 对象的 `final` 封装。可能会经常用到它 | +| `BufferedOutputStream` | 使用它以避免每次发送数据时都进行实际的写操作。代表“使用缓冲区”。可以调用 `flush()` 清空缓冲区 | `OutputStream`,可以指定缓冲区大小(可选) | 本质上并不提供接口,只是向进程添加缓冲功能。与接口对象搭配 | + ## Reader和Writer @@ -106,8 +111,10 @@ I/O 流屏蔽了实际的 I/O 设备中处理数据的细节: ## 本章小结 +[^1]: 很难说这就是一个很好的设计选择,尤其是与其它编程语言中简单的 I/O 类库相比较。但它确实是如此选择的一个正当理由。 + +[^2]: XML 是另一种方式,可以解决在不同计算平台之间移动数据,而不依赖于所有平台上都有 Java 这一问题。XML 将在[附录:对象序列化](./Appendix-Object-Serialization.md)一章中进行介绍。
-[^表 IO-3]: \ No newline at end of file