Java IO 分為 字節流(InputStream/OutputStream)與 字符流(Reader/Writer)兩大體系,前者處理二進制數據,後者處理文本(自動編解碼)。本文梳理核心類繼承關係、關鍵源碼邏輯、裝飾器模式應用及選型決策表。
InputStream (abstract)
├── ByteArrayInputStream // 內存字節數組
├── FileInputStream // 文件讀取
├── PipedInputStream // 管道輸入
├── ObjectInputStream // 對象反序列化
└── FilterInputStream (裝飾器基類)
├── BufferedInputStream // 緩衝 + mark/reset
├── DataInputStream // 基本類型讀取
└── PrintStream // 格式化輸出
OutputStream (abstract)
├── ByteArrayOutputStream // 內存字節數組(自動擴容)
├── FileOutputStream // 文件寫入
├── PipedOutputStream // 管道輸出
├── ObjectOutputStream // 對象序列化
└── FilterOutputStream
├── BufferedOutputStream // 緩衝寫入
├── DataOutputStream // 基本類型寫入
└── PrintStream
Reader / Writer 結構對稱,底層委託 InputStream/OutputStream + 編碼轉換
grow() 以 2 倍擴容(newCapacity = oldCapacity << 1)write(byte[] b, int off, int len) 內部調用 System.arraycopysynchronizedbyte[] buf,默認 8KBfill() 根據 markpos、marklimit 決定:buf.length >= marklimit:取消標記buf.length < marklimit:擴容保留標記marklimit 防止無限擴容導致 OOMconnect() 或構造時綁定SerializableserialVersionUID 版本控制| 場景 | 推薦類 | 備註 |
|---|---|---|
| 文本文件讀寫 | FileReader / FileWriter | 默認平台編碼,建議指定 UTF-8 |
| 二進制文件(圖片、視頻) | FileInputStream / FileOutputStream | 純字節操作 |
| 網絡傳輸 | InputStream / OutputStream | Socket.getInputStream() |
| 需要緩衝提速 | BufferedInputStream / BufferedReader | 裝飾器模式包裝 |
| 基本類型序列化 | DataInputStream / DataOutputStream | 跨平台二進制格式 |
| 對象持久化/傳輸 | ObjectInputStream / ObjectOutputStream | 實現 Serializable |
| 控制台/日志輸出 | PrintStream / PrintWriter | 自動 flush、不拋異常 |
| 字節↔字符轉換 | InputStreamReader / OutputStreamWriter | 橋接兩大體系,指定 Charset |
| 內存數據操作 | ByteArrayInputStream / CharArrayWriter | 無 IO 開銷 |
| 進程間通信 | PipedInputStream / PipedReader | 線程級管道 |
new BufferedReader(new FileReader(file)),減少系統調用。new InputStreamReader(is, StandardCharsets.UTF_8)。Files.copy() 或 FileChannel.transferTo() 零拷貝更高效。理解 IO 體系的「裝飾器鏈」設計,靈活組合節點流與處理流,是寫出高健壯、高性能 IO 代碼的關鍵。