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() 強制寫入緩衝區內容
  • 處理大檔案時建議使用緩衝串流