Java IO 以裝飾器模式著稱:雖啟動代碼較繁瑣,但賦予開發者對讀寫全鏈路的精細控制,實現功能模塊化自由組合。
import java.io.*;
public class Test {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("IO Problem: " + e.getMessage());
}
}
}

readLine() 等高級讀取方法,減少系統調用,大幅提升性能。br.readLine() 時,若緩衝區無數據,底層自動從 FileReader 讀取填充。裝飾器優勢:同一 BufferedReader 可裝飾標準輸入、網絡流、管道流等任意 Reader,緩衝邏輯復用極致。

// 精確控制編碼、字節讀取策略
InputStream is = new FileInputStream("data.bin");
Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(reader);
FileReader 內部固化編碼與緩衝策略;拆分組合則可:指定編碼、自定義緩衝區大小、插入解密/解壓流等。

| 基類 | 數據類型 | 典型子類 | 適用場景 |
|---|---|---|---|
| InputStream | 字節流 | FileInputStream, ByteArrayInputStream, GZIPInputStream | 二進制數據:圖片、視頻、序列化對象、壓縮流 |
| OutputStream | 字節流 | FileOutputStream, ByteArrayOutputStream, GZIPOutputStream | 同上,寫入 |
| Reader | 字符流 | FileReader, BufferedReader, InputStreamReader | 文本數據:日志、配置、JSON、XML |
| Writer | 字符流 | FileWriter, BufferedWriter, OutputStreamWriter | 同上,寫入 |
橋接關鍵:InputStreamReader(字節→字符)、OutputStreamWriter(字符→字節),指定 Charset 避免亂碼。

try (DataInputStream dis = new DataInputStream(
new GZIPInputStream(new FileInputStream("numbers.gz")))) {
while (true) {
int num = dis.readInt(); // 直接讀取 int
System.out.println(num);
}
} catch (EOFException e) {
// 正常讀完結束
}
try (BufferedWriter bw = new BufferedWriter(
new FileWriter("output.txt", StandardCharsets.UTF_8))) {
bw.write("Thank you for your fish.");
bw.newLine(); // 跨平台換行
}
Java IO 核心心法:節點流接源/終點,處理流加能力,裝飾器自由組合。JDK 7+
try-with-resources強制關閉資源;NIO.2 (Files,Path) 提供更現代、高性能、函數式 API,新項目優先考慮。