首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 讀取 2GB 大 CSV 文件:按行流式處理避免 OOM,無需 NIO 分割

     編輯:程式設計綜合問答

誤區澄清

「傳統 IO 讀寫會出問題」是**錯誤認知**。BufferedReader.readLine() 底層已實現流式讀取,**逐行返回**,不會將整文件載入內存。

推薦方案:BufferedReader 流式處理


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) 提升大文件讀取吞吐。
  • CSV 解析:字段含逗號、引號、換行時需正規解析器,推薦 Apache Commons CSV 或 OpenCSV。
    
    // Commons CSV 示例
    CSVParser parser = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(br);
    for (CSVRecord record : parser) {
        String col1 = record.get("column_name");
    }
    
  • 異常行處理:捕獲解析異常,記錄行號並跳過,不中斷主流程。

何時需要 NIO / 分割?

場景方案
需**隨機訪問**特定行/字節RandomAccessFile 或 MappedByteBuffer
需**並行處理**不同區塊預先分割文件(按行號範圍),多線程各處理一段
單行極長(超過 Integer.MAX_VALUE 字符)自定義 Reader 分塊讀取

總結

**2GB CSV 直接用 BufferedReader 按行讀取即可**,無需 NIO 分割。重點在於 CSV 解析器的健壯性與業務邏輯的流式處理能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved