緩衝流是 IO 性能優化的第一把交椅。它本身不具備直接讀寫源/目的地的能力,而是包裝在節點流外層,在內存中劃分緩衝區(默認 8192 字節/字符),批量讀取、批量寫入,將系統調用次數降低數量級。本文詳細解析四大緩衝流實戰用法。
應用程序向緩衝區寫入字節,緩衝區滿或 flush()/close() 時一次性刷入底層流。
// 示例:高效寫入大量字節
FileOutputStream fos = new FileOutputStream("data.bin");
BufferedOutputStream bos = new BufferedOutputStream(fos, 16384); // 自定義緩衝區 16KB
for (int i = 0; i < 1000000; i++) {
bos.write(i); // 單字節寫入極快,實際走內存緩衝
}
bos.flush(); // 強制刷新
bos.close(); // 關閉會自動 flush,並關閉底層 fos
創建時分配內部緩衝數組,從底層流批量讀入緩衝區,後續 read() 直接從緩衝區取數據。
// 示例:高效讀取大文件
FileInputStream fis = new FileInputStream("bigfile.dat");
BufferedInputStream bis = new BufferedInputStream(fis, 16384);
byte[] buf = new byte[4096];
int len;
while ((len = bis.read(buf)) != -1) {
// 處理數據
}
bis.close();
緩衝字符/字符串/數組,提供 newLine() 跨平台換行。
FileWriter fw = new FileWriter("log.txt", true);
BufferedWriter bw = new BufferedWriter(fw, 8192);
bw.write("第一行日誌");
bw.newLine(); // 自動根據系統換行符
bw.write("第二行日誌");
bw.flush();
bw.close();
默認緩衝區 8192 字符。readLine() 讀取一行(不含換行符),返回 null 表示結束。讀取文本文件首選。
FileReader fr = new FileReader("config.properties");
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // 處理每行
}
br.close();
| 流 | 處理單位 | 核心 API | 適用場景 | flush/close 行為 |
|---|---|---|---|---|
| BufferedOutputStream | byte | write(int/byte[]) | 二進制高頻寫入 | flush() 刷緩衝;close() 刷緩衝+關底層 |
| BufferedInputStream | byte | read()/read(byte[]) | 二進制高頻讀取 | close() 關底層 |
| BufferedWriter | char | write(String/char[])/newLine() | 文本高頻寫入、換行 | flush() 刷緩衝;close() 刷緩衝+關底層 |
| BufferedReader | char | readLine()/read()/read(char[]) | 文本按行讀取、高頻讀取 | close() 關底層 |
new BufferedInputStream(new FileInputStream(file))bufferedStream.close() 會自動關閉底層節點流,不要重複關閉。close() 會自動 flush。字符流建議適時 flush() 確保數據落盤。四大緩衝流是 Java IO 高性能的基石:BufferedInputStream/OutputStream 守護二進制,BufferedReader/Writer 統治文本。牢記包裝順序、只關外層、善用 readLine()/newLine(),你的 IO 代碼將兼具性能與優雅。