Java I/O 採用裝飾者模式靈活組合功能。本文系統梳理位元組流與字符流體系、核心子類功能、典型組合場景。
數據源:位元組數組、String、文件、管道、序列流
| 子類 | 功能 | 構造參數 |
|---|---|---|
| ByteArrayInputStream | 內存緩衝區作為輸入源 | byte[] |
| StringBufferInputStream | String 轉輸入流(已棄用) | String |
| FileInputStream | 文件讀取 | File/String/FileDescriptor |
| PipedInputStream | 管道輸入端,配合 PipedOutputStream | PipedOutputStream |
| SequenceInputStream | 合併多個 InputStream | Enumeration |
| FilterInputStream | 裝飾者基類,提供增強功能 | InputStream |
| 裝飾者 | 功能 |
|---|---|
| DataInputStream | 讀取基本類型(int、long、UTF 字符串),配合 DataOutputStream |
| BufferedInputStream | 緩衝讀取,減少物理 I/O 次數 |
| LineNumberInputStream | 追蹤行號(已棄用,用 LineNumberReader) |
| PushbackInputStream | 支持退回一個位元組 |
| 子類 | 功能 | 構造參數 |
|---|---|---|
| ByteArrayOutputStream | 內存緩衝區輸出 | 初始容量 |
| FileOutputStream | 文件寫入 | File/String/FileDescriptor + append 模式 |
| PipedOutputStream | 管道輸出端 | PipedInputStream |
| 裝飾者 | 功能 |
|---|---|
| DataOutputStream | 寫入基本類型,配合 DataInputStream |
| PrintStream | 格式化輸出(print/println),System.out 即此類 |
| BufferedOutputStream | 緩衝寫入,需手動 flush() |
處理文本數據,自動處理編碼轉換,核心類:FileReader/Writer、BufferedReader/Writer、InputStreamReader/OutputStreamWriter(位元組↔字符橋樑)、PrintWriter。
// 緩衝文本讀取(推薦)
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) { System.out.println(line); }
}
// 數據流持久化
try (DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.bin")))) {
dos.writeInt(123);
dos.writeUTF("Hello");
}
// 管道通信(線程間)
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream(pos);
// 線程 A 寫 pos,線程 B 讀 pis
優勢:動態組合功能,避免繼承爆炸,單一職責。
close() → 使用 try-with-resources (Java 7+)StandardCharsets.UTF_8BufferedInputStream/Reader