首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java IO 體系全景:字節流與字符流核心類源碼解析與選型指南

     編輯:Java 綜合教學

Java IO 體系全景圖

Java IO 分為 字節流(InputStream/OutputStream)與 字符流(Reader/Writer)兩大體系,前者處理二進制數據,後者處理文本(自動編解碼)。本文梳理核心類繼承關係、關鍵源碼邏輯、裝飾器模式應用及選型決策表。

1. 類繼承架構速覽

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 + 編碼轉換

2. 核心類源碼關鍵點

ByteArrayOutputStream — 自動擴容數組

  • 默認容量 32,grow() 以 2 倍擴容(newCapacity = oldCapacity << 1)
  • write(byte[] b, int off, int len) 內部調用 System.arraycopy
  • 線程安全:方法加 synchronized

BufferedInputStream — 緩衝與 mark/reset

  • 內部 byte[] buf,默認 8KB
  • fill() 根據 markpos、marklimit 決定:
    — 未標記/空間足:直接重新填滿
    — 已標記且空間足:保留標記後數據,追加新數據
    — 已標記且空間不足 && buf.length >= marklimit:取消標記
    — 已標記且空間不足 && buf.length < marklimit:擴容保留標記
  • marklimit 防止無限擴容導致 OOM

PipedInputStream / PipedOutputStream — 線程間通信

  • 必須成對 connect() 或構造時綁定
  • 內部共享環形緩衝區(默認 1KB),生產者寫、消費者讀
  • 典型場景:生產者線程寫入,消費者線程讀取

ObjectInputStream / ObjectOutputStream — 序列化

  • 要求對象實現 Serializable
  • 支持基本類型、String、數組、集合、自定義對象
  • 注意 serialVersionUID 版本控制

3. 字節流 vs 字符流 選型決策表

場景推薦類備註
文本文件讀寫FileReader / FileWriter默認平台編碼,建議指定 UTF-8
二進制文件(圖片、視頻)FileInputStream / FileOutputStream純字節操作
網絡傳輸InputStream / OutputStreamSocket.getInputStream()
需要緩衝提速BufferedInputStream / BufferedReader裝飾器模式包裝
基本類型序列化DataInputStream / DataOutputStream跨平台二進制格式
對象持久化/傳輸ObjectInputStream / ObjectOutputStream實現 Serializable
控制台/日志輸出PrintStream / PrintWriter自動 flush、不拋異常
字節↔字符轉換InputStreamReader / OutputStreamWriter橋接兩大體系,指定 Charset
內存數據操作ByteArrayInputStream / CharArrayWriter無 IO 開銷
進程間通信PipedInputStream / PipedReader線程級管道

4. 最佳實踐建議

  • 優先用字符流處理文本,避免編碼亂碼;二進制堅持字節流。
  • 必須加緩衝:new BufferedReader(new FileReader(file)),減少系統調用。
  • try-with-resources 自動關閉(Java 7+),防止資源洩漏。
  • 指定 Charset:new InputStreamReader(is, StandardCharsets.UTF_8)。
  • 大文件拷貝:NIO Files.copy() 或 FileChannel.transferTo() 零拷貝更高效。

理解 IO 體系的「裝飾器鏈」設計,靈活組合節點流與處理流,是寫出高健壯、高性能 IO 代碼的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved