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

Java 高效讀取大文件:避免 OOM 的流式處理最佳實踐

     編輯:Java 綜合教學

Java 高效讀取大文件:避免 OOM 的流式處理最佳實踐

1. 概述

本文演示如何在 Java 中高效讀取大文件,屬於 Baeldung「Java——回歸基礎」系列教程。核心目標:不將整個文件載入內存,而是逐行流式處理。

2. 內存讀取方式的缺陷

標準方式使用 Guava 或 Apache Commons IO 一次性讀取所有行:

Files.readLines(new File(path), Charsets.UTF_8);
FileUtils.readLines(new File(path));

問題:所有行存入內存,文件過大時拋出 OutOfMemoryError。實測讀取 1GB 文件:

  • 開始:佔用 ~0MB 內存
  • 讀完:佔用 ~2.1GB 內存(Total Memory 2666MB,Free 490MB)

顯而易見,無論內存多大,一次性載入終將耗盡資源。且通常無需保留所有行,只需逐行處理後丟棄。

3. 方案一:Scanner + FileInputStream(原生 JDK)

FileInputStream inputStream = null;
Scanner sc = null;
try {
    inputStream = new FileInputStream(path);
    sc = new Scanner(inputStream, "UTF-8");
    while (sc.hasNextLine()) {
        String line = sc.nextLine();
        // 處理每一行
    }
    if (sc.ioException() != null) throw sc.ioException();
} finally {
    if (inputStream != null) inputStream.close();
    if (sc != null) sc.close();
}

效果:遍歷所有行,不保持引用,內存佔用穩定在 ~150MB(Total 763MB,Free 605MB)。

4. 方案二:Apache Commons IO LineIterator

LineIterator it = FileUtils.lineIterator(theFile, "UTF-8");
try {
    while (it.hasNext()) {
        String line = it.nextLine();
        // 處理每一行
    }
} finally {
    LineIterator.closeQuietly(it);
}

效果:同樣不將整文件載入內存,佔用 ~150MB(Total 752MB,Free 564MB)。

5. 結論

流式逐行處理是大文件讀取的正確姿勢:

  • 避免 OutOfMemoryError
  • 內存佔用恆定,不隨文件大小增長
  • 適用於日誌分析、數據遷移、批量導入等場景

完整代碼可在 GitHub 專案獲取(基於 Eclipse,易導入運行)。

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