基礎 IO 類(FileInputStream 等)每次讀寫都直接觸發系統呼叫,頻繁切換用戶/核心態,效率極低。緩衝流在記憶體建立緩衝區(預設 8KB),批量讀取/寫入,大幅減少系統呼叫次數,是提升 IO 效率的首選裝飾流。
位元組流(InputStream)與字符流(Reader)體系不相容,無法直接嵌套。橋接流專門負責跨體系轉換:
InputStreamReader:位元組輸入流 → 字符輸入流(指定 Charset 解碼)OutputStreamWriter:位元組輸出流 → 字符輸出流(指定 Charset 編碼)⚠️ 單向轉換:位元組 → 字符 OK,字符 → 位元組需用 OutputStreamWriter。
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in) // 橋接:位元組 → 字符
);
import java.io.*;
public class ReadConsoleWithBuffer {
public static void main(String[] args) {
BufferedReader br = null;
try {
// 三層嵌套:系統流 → 橋接 → 緩衝
br = new BufferedReader(new InputStreamReader(System.in));
String line;
do {
System.out.print("請輸入:");
line = br.readLine(); // 按行讀取,不含換行符
if (line == null) break; // EOF (Ctrl+D/Ctrl+Z)
System.out.println("您輸入:" + line);
} while (!"quit".equals(line));
} catch (IOException e) {
e.printStackTrace();
} finally {
// 關閉最外層流,會自動級聯關閉內層
if (br != null) try { br.close(); } catch (IOException ignored) {}
}
}
}
readLine():以 \n/\r\n/\r 為分隔,返回內容不包含換行符;流結束返回 null。BufferedReader 只能包裝 Reader,故必須先用 InputStreamReader 橋接 System.in。br.close() 會遞歸關閉 InputStreamReader 和 System.in(但標準流關閉後無法重開,實際專案中通常不關閉 System.in/out/err)。
try (BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("log.txt"), StandardCharsets.UTF_8))) {
bw.write("第一行");
bw.newLine(); // 跨平台換行符
bw.write("第二行");
bw.flush(); // 強制刷新緩衝區到磁碟
}
newLine() 會根據系統屬性 line.separator 寫入正確換行符(Win: \r\n, Linux: \n, Mac: \r)。
原始流 (節點流)
│
▼
┌─────────────┐
│ 裝飾流 A │ ← 功能增強 A (如緩衝)
│ - delegate │
└──────┬──────┘
│
▼
┌─────────────┐
│ 裝飾流 B │ ← 功能增強 B (如編碼轉換)
│ - delegate │
└──────┬──────┘
│
▼
應用程式
| 場景 | 推薦嵌套結構 |
|---|---|
| 高效讀取文字檔 | new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")) |
| 高效寫入文字檔 | new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")) |
| 讀取基本類型/字串 | new DataInputStream(new BufferedInputStream(new FileInputStream(file))) |
| 序列化物件讀取 | new ObjectInputStream(new BufferedInputStream(new FileInputStream(file))) |
緩衝流是 IO 效率的加速器,橋接流是跨體系的橋樑。掌握三層嵌套標準結構(節點流 → 橋接流 → 緩衝流),即可應對 90% 的文字檔案/控制台讀寫場景。記住:只關閉最外層流,資源鏈自動級聯釋放。