Stream 核心抽象
Stream 代表「有能力產出資料的來源」或「有能力接收資料的目的地」。Java I/O 所有流分兩大體系:
一、位元組流(Byte Stream)—— 處理二進位資料
| 方向 | 抽象基類 | 主要實作類別 | 用途 |
| 輸入 | InputStream | ByteArrayInputStream | 記憶體緩衝區作為輸入源 |
| | StringBufferInputStream(過時) | String 物件作為輸入源 |
| | FileInputStream | 檔案讀取 |
| | PipedInputStream | 線程間管道通訊 |
| | SequenceInputStream | 合併多個輸入流 |
| 輸出 | OutputStream | ByteArrayOutputStream | 寫入記憶體緩衝區 |
| | FileOutputStream | 檔案寫入 |
| | PipedOutputStream | 線程間管道通訊 |
| | SequenceOutputStream | 合併多個輸出流 |
二、字元流(Character Stream)—— 處理 Unicode 文字
| 方向 | 抽象基類 | 主要實作類別 | 對應位元組流 |
| 輸入 | Reader | CharArrayReader | ByteArrayInputStream |
| | StringReader | StringBufferInputStream |
| | FileReader | FileInputStream |
| | PipedReader | PipedInputStream |
| 輸出 | Writer | CharArrayWriter | ByteArrayOutputStream |
| | StringWriter | 無對應 |
| | FileWriter | FileOutputStream |
| | PipedWriter | PipedOutputStream |
設計精髓:裝飾模式(Wrapper Pattern)
- 字元流建構於位元組流之上:
FileReader 內部包裝 FileInputStream + 字集解碼器。
- 功能增強透過層層包裝:
BufferedReader 包裝 FileReader 提供緩衝與逐行讀取。
- 標準轉換橋樑:
InputStreamReader(位元組→字元)、OutputStreamWriter(字元→位元組),指定編碼(UTF-8、Big5 等)。
實務選型指南
- 二進位檔(圖片、聲音、序列化物件)→ 位元組流
- 文字檔(原始碼、設定檔、日誌)→ 字元流 + 明確編碼
- 高效能讀寫 → 加
Buffered 前綴類別
- Java 7+ →
Files、Paths、try-with-resources 簡化資源管理