Java IO 流是數據傳輸的抽象,文件是靜態存儲,流是動態傳輸。本文梳理流的分類體系、核心類繼承關係、裝飾器模式應用、字節字符轉換橋梁,並總結實戰中常用組合模式。
// 字節流
InputStream (abstract) ← FileInputStream, ByteArrayInputStream, PipedInputStream
OutputStream (abstract) ← FileOutputStream, ByteArrayOutputStream, PipedOutputStream
// 字符流
Reader (abstract) ← FileReader, CharArrayReader, PipedReader
Writer (abstract) ← FileWriter, CharArrayWriter, PipedWriter
處理流構造器接收一個同類型的流對象,將核心操作委託給被包裝流,自身負責增強邏輯:
// 典型嵌套:文件字節流 → 緩衝字節流 → 數據流 → 壓縮流
DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("data.dat")));
這種設計實現了 功能組合靈活、職責單一、符合開閉原則。
| 轉換方向 | 橋梁類 | 說明 |
|---|---|---|
| 字節流 → 字符流(讀) | InputStreamReader | 解碼,指定 Charset |
| 字符流 → 字節流(寫) | OutputStreamWriter | 編碼,指定 Charset |
// 推薦組合:緩衝 + 轉換
BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream("file.txt"), StandardCharsets.UTF_8));
| 場景 | 代碼模式 | 關鍵點 |
|---|---|---|
| 生成 ZIP 下載 | ZipOutputStream → ServletOutputStream | 直接寫響應流,無臨時文件 |
| 寫 XML 文件 | XMLWriter → FileOutputStream | dom4j/JDOM 等庫內部同理 |
| 追加寫文本 | PrintStream → FileOutputStream(append=true) | PrintStream 內部用 OutputStreamWriter |
| Socket 發送二進制 | DataOutputStream → Socket.getOutputStream() | 支持基本類型寫入 |
| 讀取文本行 | BufferedReader → FileReader | readLine() 高效 |
| Socket 讀取二進制 | BufferedInputStream → Socket.getInputStream() | 批量讀取減少系統調用 |
InputStream:read(), read(byte[]), read(byte[], off, len)OutputStream:write(int), write(byte[]), write(byte[], off, len)Reader/Writer:對應 read(char[]), write(char[]), write(String)close()(或 try-with-resources),釋放文件句柄/網絡端口。flush() 確保緩衝區數據落盤。Charset,避免跨平台亂碼。Files.copy()(NIO 零拷貝)而非流手工循環。Java IO 流體系雖類眾多,但核心只有四大抽象基類,其餘皆為裝飾器組合。掌握「節點流對接設備、處理流增強功能、橋梁類轉換編碼」三條主線,實戰中按場景組合即可。新項目推薦使用 java.nio.file.Files 簡化代碼、提升性能。