Java 緩衝串流 (Buffered I/O)
緩衝串流透過內部緩衝區減少實際 I/O 操作次數,大幅提升讀寫效能。
引入套件
import java.io.*;
字元緩衝串流
BufferedReader
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
// 逐行讀取
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 指定緩衝區大小
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"), 8192)) {
// 預設 8KB,可自訂
}
BufferedWriter
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
writer.write("第一行");
writer.newLine(); // 跨平台換行符
writer.write("第二行");
writer.newLine();
writer.flush(); // 強制寫入
} catch (IOException e) {
e.printStackTrace();
}
位元組緩衝串流
BufferedInputStream
try (BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("image.jpg"))) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
// 處理資料
}
} catch (IOException e) {
e.printStackTrace();
}
BufferedOutputStream
try (BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("output.bin"))) {
byte[] data = {0x48, 0x65, 0x6C, 0x6C, 0x6F};
bos.write(data);
bos.flush();
} catch (IOException e) {
e.printStackTrace();
}
效能比較
// 無緩衝(較慢)
try (FileReader reader = new FileReader("large.txt")) {
int ch;
while ((ch = reader.read()) != -1) {
// 每次讀取都是 I/O 操作
}
}
// 有緩衝(較快)
try (BufferedReader reader = new BufferedReader(new FileReader("large.txt"))) {
int ch;
while ((ch = reader.read()) != -1) {
// 從緩衝區讀取,減少 I/O 次數
}
}
實用範例
複製大檔案
public static void copyFile(String source, String dest) throws IOException {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
}
}
逐行處理文字檔
public static void processLines(String path, Consumer<String> processor) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
String line;
while ((line = reader.readLine()) != null) {
processor.accept(line);
}
}
}
// 使用
processLines("data.txt", line -> {
if (line.contains("ERROR")) {
System.out.println(line);
}
});
計算檔案行數
public static long countLines(String path) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
return reader.lines().count();
}
}
重點整理
- 緩衝串流減少實際 I/O 操作,提升效能
BufferedReader提供readLine()方法BufferedWriter提供newLine()跨平台換行- 預設緩衝區 8KB,可自訂大小
- 使用
flush()強制寫入緩衝區內容 - 處理大檔案時建議使用緩衝串流