Java IO 體系概覽
Java IO 操作的核心在於「流」的概念,所有 IO 類別主要分為兩大家族:字節流(以 InputStream/OutputStream 為根)與 字符流(以 Reader/Writer 為根)。理解其繼承結構,是掌握高效 IO 開發的基石。
字符流體系(處理文本數據)
輸入端:Reader 及其子類
- Reader:抽象基類,定義字符輸入的基本契約。
- BufferedReader:裝飾者模式典範,提供緩衝區大幅提升讀取效率,並支援
readLine() 按行讀取。
- LineNumberReader:繼承 BufferedReader,自動維護行號計數器。
- InputStreamReader:橋梁角色,將字節流按指定編碼解碼為字符流,是跨越二進制與文本世界的關鍵。
- FileReader:InputStreamReader 的便利子類,默認使用平台編碼讀取文件。
- StringReader:從字符串讀取字符流,常用於測試或內存操作。
輸出端:Writer 及其子類
- Writer:抽象基類,定義字符輸出契約。
- BufferedWriter:提供緩衝寫入,含
newLine() 跨平台換行。
- OutputStreamWriter:反向橋梁,將字符按編碼編碼為字節流輸出。
- FileWriter:OutputStreamWriter 便利子類,默認編碼寫入文件。
- StringWriter:向內存字符串緩衝區寫入,最終可
toString() 獲取結果。
- PrintWriter:功能最豐富的字符輸出類,支援格式化打印(
printf)、自動刷新、不拋出 IOException(需自行 checkError())。
字節流體系(處理二進制數據)
輸入端:InputStream 及其子類
- InputStream:抽象基類,定義
read() 等核心方法。
- FileInputStream:從文件系統讀取字節,最常用的源頭流。
- ByteArrayInputStream:內存源頭,構造時需傳入
byte[] 作為數據源,無系統資源佔用,無需關閉。
- SequenceInputStream:合併流,將多個 InputStream 串聯為單一流順序讀取。
輸出端:OutputStream 及其子類
- OutputStream:抽象基類,定義
write() 核心方法。
- FileOutputStream:向文件系統寫入字節,最常用的目的地流。
- ByteArrayOutputStream:內存目的地,內部維護可擴展的
byte[] 緩衝區,調用 toByteArray() 獲取結果,同樣無系統資源佔用。
設計模式與最佳實踐
Java IO 大量採用 裝飾者模式:基礎流(如 FileInputStream)負責接入物理設備,處理流(如 BufferedInputStream、DataInputStream)負責增強功能。開發時應遵循「先接物理設備,再套裝飾器」的鏈式構建原則。
關鍵橋梁 InputStreamReader/OutputStreamWriter 讓字節與字符世界互通,**務必顯式指定編碼**(如 StandardCharsets.UTF_8),避免平台默認編碼導致的亂碼與可移植性問題。