# 10.1 輸入和輸出
可將Java庫的IO類分割為輸入與輸出兩個部分,這一點在用Web瀏覽器閱讀聯機Java類文檔時便可知道。通過繼承,從`InputStream`(輸入流)派生的所有類都擁有名為`read()`的基本方法,用于讀取單個字節或者字節數組。類似地,從`OutputStream`派生的所有類都擁有基本方法`write()`,用于寫入單個字節或者字節數組。然而,我們通常不會用到這些方法;它們之所以存在,是因為更復雜的類可以利用它們,以便提供一個更有用的接口。因此,我們很少用單個類創建自己的系統對象。一般情況下,我們都是將多個對象重疊在一起,提供自己期望的功能。我們之所以感到Java的流庫(Stream Library)異常復雜,正是由于為了創建單獨一個結果流,卻需要創建多個對象的緣故。
很有必要按照功能對類進行分類。庫的設計者首先決定與輸入有關的所有類都從`InputStream`繼承,而與輸出有關的所有類都從`OutputStream`繼承。
## 10.1.1 `InputStream`的類型
`InputStream`的作用是標志那些從不同起源地產生輸入的類。這些起源地包括(每個都有一個相關的`InputStream`子類):
(1) 字節數組
(2) `String`對象
(3) 文件
(4) “管道”,它的工作原理與現實生活中的管道類似:將一些東西置入一端,它們在另一端出來。 (5) 一系列其他流,以便我們將其統一收集到單獨一個流內。
(6) 其他起源地,如Internet連接等(將在本書后面的部分講述)。
除此以外,`FilterInputStream`也屬于`InputStream`的一種類型,用它可為“析構器”類提供一個基類,以便將屬性或者有用的接口同輸入流連接到一起。這將在以后討論。
```
Class
Function
Constructor Arguments
How to use it
ByteArray-InputStream
Allows a buffer in memory to be used as an InputStream.
The buffer from which to extract the bytes.
As a source of data. Connect it to a FilterInputStream object to provide a useful interface.
StringBuffer-InputStream
Converts a String into an InputStream.
A String. The underlying implementation actually uses a StringBuffer.
As a source of data. Connect it to a FilterInputStream object to provide a useful interface.
File-InputStream
For reading information from a file.
A String representing the file name, or a File or FileDescriptor object.
As a source of data. Connect it to a FilterInputStream object to provide a useful interface.
```
| 類 | 功能 | 構造器參數/如何使用 |
| --- | --- | --- |
| `ByteArrayInputStream |` 允許內存中的一個緩沖區作為`InputStream`使用 | 從中提取字節的緩沖區/作為一個數據源使用。通過將其同一個`FilterInputStream`對象連接,可提供一個有用的接口 |
| `StringBufferInputStream` | 將一個`String`轉換成`InputStream` | 一個`String`(字符串)。基礎的實現方案實際采用一個 |
| `StringBuffer`(字符串緩沖)/作為一個數據源使用。 | 通過將其同一個FilterInputStream對象連接,可提供一個有用的接口 |
| `FileInputStream` | 用于從文件讀取信息 | 代表文件名的一個`String`,或者一個`File`或`FileDescriptor`對象/作為一個數據源使用。通過將其同一個`FilterInputStream`對象連接,可提供一個有用的接口 |
```
Piped-InputStream
Produces the data that’s being written to the associated PipedOutput-Stream. Implements the “piping” concept.
PipedOutputStream
As a source of data in multithreading. Connect it to a FilterInputStream object to provide a useful interface.
Sequence-InputStream
Coverts two or more InputStream objects into a single InputStream.
Two InputStream objects or an Enumeration for a container of InputStream objects.
As a source of data. Connect it to a FilterInputStream object to provide a useful interface.
Filter-InputStream
Abstract class which is an interface for decorators that provide useful functionality to the other InputStream classes. See Table 10-3.
See Table 10-3.
See Table 10-3.
```
| 類 | 功能 | 構造器參數/如何使用 |
| --- | --- | --- |
| `PipedInputString` | 產生為相關的`PipedOutputStream`寫的數據。實現了“管道化”的概念 | `PipedOutputStream`/作為一個數據源使用。通過將其同一個`FilterInputStream`對象連接,可提供一個有用的接口 |
| `SequenceInputStream` | 將兩個或更多的`InputStream`對象轉換成單個`InputStream`使用 | 兩個`InputStream`對象或者一個`Enumeration`,用于`InputStream`對象的一個容器/作為一個數據源使用。通過將其同一個`FilterInputStream`對象連接,可提供一個有用的接口 |
| `FilterInputStream` | 對作為析構器接口使用的類進行抽象;那個析構器為其他`InputStream`類提供了有用的功能。參見表10.3 | 參見表10.3/參見表10.3 |
## 10.1.2 `OutputStream`的類型
這一類別包括的類決定了我們的輸入往何處去:一個字節數組(但沒有`String`;假定我們可用字節數組創建一個);一個文件;或者一個“管道”。
除此以外,`FilterOutputStream`為“析構器”類提供了一個基類,它將屬性或者有用的接口同輸出流連接起來。這將在以后討論。
表10.2 `OutputStream`的類型
```
Class
Function
Constructor Arguments
How to use it
ByteArray-OutputStream
Creates a buffer in memory. All the data that you send to the stream is placed in this buffer.
Optional initial size of the buffer.
To designate the destination of your data. Connect it to a FilterOutputStream object to provide a useful interface.
File-OutputStream
For sending information to a file.
A String representing the file name, or a File or FileDescriptor object.
To designate the destination of your data. Connect it to a FilterOutputStream object to provide a useful interface.
Piped-OutputStream
Any information you write to this automatically ends up as input for the associated PipedInput-Stream. Implements the “piping” concept.
PipedInputStream
To designate the destination of your data for multithreading. Connect it to a FilterOutputStream object to provide a useful interface.
Filter-OutputStream
Abstract class which is an interface for decorators that provide useful functionality to the other OutputStream classes. See Table
10-4.
See Table 10-4.
See Table 10-4.
```
| 類 | 功能 | 構造器參數 / 如何使用 |
| --- | --- | --- | --- |
| `ByteArrayOutputStream` | 在內存中創建一個緩沖區。我們發送給流的所有數據都會置入這個緩沖區。| 可選緩沖區的初始大小 / 用于指出數據的目的地。若將其同`FilterOutputStream`對象連接到一起,可提供一個有用的接口 |
| `FileOutputStream` | 將信息發給一個文件 | 用一個String代表文件名,或選用一個`File`或`FileDescriptor`對象 / 用于指出數據的目的地。若將其同`FilterOutputStream`對象連接到一起,可提供一個有用的接口 |
| `PipedOutputStream ` | 我們寫給它的任何信息都會自動成為相關的`PipedInputStream`的輸出。實現了“管道化”的概念 | `PipedInputStream`/為多線程處理指出自己數據的目的地 / 將其同`FilterOutputStream`對象連接到一起,便可提供一個有用的接口
| `FilterOutputStream` | 對作為析構器接口使用的類進行抽象處理;那個析構器為其他`OutputStream`類提供了有用的功能。參見表10.4 | 參見表10.4 |
- Java 編程思想
- 寫在前面的話
- 引言
- 第1章 對象入門
- 1.1 抽象的進步
- 1.2 對象的接口
- 1.3 實現方案的隱藏
- 1.4 方案的重復使用
- 1.5 繼承:重新使用接口
- 1.6 多態對象的互換使用
- 1.7 對象的創建和存在時間
- 1.8 異常控制:解決錯誤
- 1.9 多線程
- 1.10 永久性
- 1.11 Java和因特網
- 1.12 分析和設計
- 1.13 Java還是C++
- 第2章 一切都是對象
- 2.1 用引用操縱對象
- 2.2 所有對象都必須創建
- 2.3 絕對不要清除對象
- 2.4 新建數據類型:類
- 2.5 方法、參數和返回值
- 2.6 構建Java程序
- 2.7 我們的第一個Java程序
- 2.8 注釋和嵌入文檔
- 2.9 編碼樣式
- 2.10 總結
- 2.11 練習
- 第3章 控制程序流程
- 3.1 使用Java運算符
- 3.2 執行控制
- 3.3 總結
- 3.4 練習
- 第4章 初始化和清除
- 4.1 用構造器自動初始化
- 4.2 方法重載
- 4.3 清除:收尾和垃圾收集
- 4.4 成員初始化
- 4.5 數組初始化
- 4.6 總結
- 4.7 練習
- 第5章 隱藏實現過程
- 5.1 包:庫單元
- 5.2 Java訪問指示符
- 5.3 接口與實現
- 5.4 類訪問
- 5.5 總結
- 5.6 練習
- 第6章 類復用
- 6.1 組合的語法
- 6.2 繼承的語法
- 6.3 組合與繼承的結合
- 6.4 到底選擇組合還是繼承
- 6.5 protected
- 6.6 累積開發
- 6.7 向上轉換
- 6.8 final關鍵字
- 6.9 初始化和類裝載
- 6.10 總結
- 6.11 練習
- 第7章 多態性
- 7.1 向上轉換
- 7.2 深入理解
- 7.3 覆蓋與重載
- 7.4 抽象類和方法
- 7.5 接口
- 7.6 內部類
- 7.7 構造器和多態性
- 7.8 通過繼承進行設計
- 7.9 總結
- 7.10 練習
- 第8章 對象的容納
- 8.1 數組
- 8.2 集合
- 8.3 枚舉器(迭代器)
- 8.4 集合的類型
- 8.5 排序
- 8.6 通用集合庫
- 8.7 新集合
- 8.8 總結
- 8.9 練習
- 第9章 異常差錯控制
- 9.1 基本異常
- 9.2 異常的捕獲
- 9.3 標準Java異常
- 9.4 創建自己的異常
- 9.5 異常的限制
- 9.6 用finally清除
- 9.7 構造器
- 9.8 異常匹配
- 9.9 總結
- 9.10 練習
- 第10章 Java IO系統
- 10.1 輸入和輸出
- 10.2 增添屬性和有用的接口
- 10.3 本身的缺陷:RandomAccessFile
- 10.4 File類
- 10.5 IO流的典型應用
- 10.6 StreamTokenizer
- 10.7 Java 1.1的IO流
- 10.8 壓縮
- 10.9 對象序列化
- 10.10 總結
- 10.11 練習
- 第11章 運行期類型識別
- 11.1 對RTTI的需要
- 11.2 RTTI語法
- 11.3 反射:運行期類信息
- 11.4 總結
- 11.5 練習
- 第12章 傳遞和返回對象
- 12.1 傳遞引用
- 12.2 制作本地副本
- 12.3 克隆的控制
- 12.4 只讀類
- 12.5 總結
- 12.6 練習
- 第13章 創建窗口和程序片
- 13.1 為何要用AWT?
- 13.2 基本程序片
- 13.3 制作按鈕
- 13.4 捕獲事件
- 13.5 文本字段
- 13.6 文本區域
- 13.7 標簽
- 13.8 復選框
- 13.9 單選鈕
- 13.10 下拉列表
- 13.11 列表框
- 13.12 布局的控制
- 13.13 action的替代品
- 13.14 程序片的局限
- 13.15 視窗化應用
- 13.16 新型AWT
- 13.17 Java 1.1用戶接口API
- 13.18 可視編程和Beans
- 13.19 Swing入門
- 13.20 總結
- 13.21 練習
- 第14章 多線程
- 14.1 反應靈敏的用戶界面
- 14.2 共享有限的資源
- 14.3 堵塞
- 14.4 優先級
- 14.5 回顧runnable
- 14.6 總結
- 14.7 練習
- 第15章 網絡編程
- 15.1 機器的標識
- 15.2 套接字
- 15.3 服務多個客戶
- 15.4 數據報
- 15.5 一個Web應用
- 15.6 Java與CGI的溝通
- 15.7 用JDBC連接數據庫
- 15.8 遠程方法
- 15.9 總結
- 15.10 練習
- 第16章 設計模式
- 16.1 模式的概念
- 16.2 觀察器模式
- 16.3 模擬垃圾回收站
- 16.4 改進設計
- 16.5 抽象的應用
- 16.6 多重分發
- 16.7 訪問器模式
- 16.8 RTTI真的有害嗎
- 16.9 總結
- 16.10 練習
- 第17章 項目
- 17.1 文字處理
- 17.2 方法查找工具
- 17.3 復雜性理論
- 17.4 總結
- 17.5 練習
- 附錄A 使用非JAVA代碼
- 附錄B 對比C++和Java
- 附錄C Java編程規則
- 附錄D 性能
- 附錄E 關于垃圾收集的一些話
- 附錄F 推薦讀物