首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 大文件按行讀取:RandomAccessFile 與 NIO 雙方案實戰

     編輯:Java 相關知識

大文件讀取不 OOM:三種方案對比與最佳實踐

GB 級文本文件按行讀取,BufferedReader.readLine() 經典可靠;RandomAccessFile 支持隨機訪問;NIO FileChannel + ByteBuffer 適合高併發大吞吐。本文提供三套完整代碼與選型指南。

方案一:BufferedReader(通用首選)

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
        process(line);
    }
}
  • 自動處理換行符(\n/\r\n/\r)
  • 內存佔用恆定(單行緩衝)
  • 編碼可控(InputStreamReader 指定 charset)

方案二:RandomAccessFile(隨機訪問/斷點續讀)

try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
    // 順序讀行
    String line;
    while ((line = raf.readLine()) != null) { process(line); }

    // 隨機跳轉:seek(position) 後 readLine()
    raf.seek(1024 * 1024); // 跳到 1MB 處
}
  • seek() 定位字節偏移,適合斷點續傳、分片處理
  • readLine() 實現簡陋(不識別 \r\n),建議自行實現行讀取邏輯

方案三:NIO FileChannel(高併發/大吞吐)

try (FileChannel in = FileChannel.open(path, StandardOpenOption.READ);
     FileChannel out = FileChannel.open(outPath, StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {
    ByteBuffer buf = ByteBuffer.allocateDirect(1024 * 1024); // 1MB 直接內存
    while (in.read(buf) != -1) {
        buf.flip();
        out.write(buf);
        buf.clear();
    }
}
  • allocateDirect 分配堆外內存,避免 JVM 堆壓力,零拷貝(OS 層面)
  • 配合 transferTo/transferFrom 可進一步利用 DMA 零拷貝
  • 適合文件複製、網絡傳輸、大數據 ETL

完整工具類:ReadFromFile

涵蓋四種讀取模式:

  • readFileByBytes():字節流(圖片/視頻/二進制)
  • readFileByChars():字符流(文本),處理 \r\n 換行兼容
  • readFileByLines():按行讀取(日志/CSV/配置)
  • readFileByRandomAccess():隨機訪問(大文件分片)

追加寫入兩種方式

// A: RandomAccessFile seek 到末尾
raf.seek(raf.length());
raf.writeBytes(content);

// B: FileWriter append 模式
new FileWriter(file, true).write(content);

選型決策樹

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦方案核心理由
順序讀文本、逐行處理BufferedReaderAPI 簡單、編碼安全、換行自適應
大文件隨機讀取、斷點續讀RandomAccessFileseek() 精確定位字節偏移
大文件複製、高併發讀寫、零拷貝NIO FileChannel + DirectBuffer堆外內存、OS 零拷貝、可擴展
二進制文件(圖片/視頻)FileInputStream + BufferedInputStream字節流語義正確