「傳統 IO 讀寫會出問題」是**錯誤認知**。BufferedReader.readLine() 底層已實現流式讀取,**逐行返回**,不會將整文件載入內存。
try (BufferedReader br = new BufferedReader(new FileReader("huge.csv"), 64*1024)) { // 64KB 緩衝
String line;
while ((line = br.readLine()) != null) {
// 解析單行 CSV
String[] fields = parseCsvLine(line); // 自寫或用 Apache Commons CSV
processRecord(fields);
}
}
BufferedReader(reader, 65536) 提升大文件讀取吞吐。Apache Commons CSV 或 OpenCSV。
// Commons CSV 示例
CSVParser parser = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(br);
for (CSVRecord record : parser) {
String col1 = record.get("column_name");
}
| 場景 | 方案 |
|---|---|
| 需**隨機訪問**特定行/字節 | RandomAccessFile 或 MappedByteBuffer |
| 需**並行處理**不同區塊 | 預先分割文件(按行號範圍),多線程各處理一段 |
| 單行極長(超過 Integer.MAX_VALUE 字符) | 自定義 Reader 分塊讀取 |
**2GB CSV 直接用 BufferedReader 按行讀取即可**,無需 NIO 分割。重點在於 CSV 解析器的健壯性與業務邏輯的流式處理能力。