Java中讀取檔案6種記憶體安全方式

banq發表於2024-04-07

Java 提供了強大的檔案處理工具。但在處理海量檔案時,傳統方法很快就會遇到記憶體限制。這可能會導致程式崩潰並影響效能。本指南探討了在 Java 中讀取大檔案而不佔用系統記憶體的技術。

我們將深入研究分塊處理資料的策略,避免一次載入整個檔案的需要。到最後,您將能夠有效地處理最龐大的檔案!

1、使用 BufferedReader 進行逐行處理: 
這種經典方法使用 a BufferedReader 逐行讀取檔案。它會處理遇到的每一行,避免一次載入整個檔案。這是一個例子:

public void processLargeFile(String filePath) throws IOException {
  try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
    String line;
    while ((line = reader.readLine()) != null) {
      <font>// Process each line here<i>
    }
  }
}

2、使用InputStream 進行分塊:
該技術利用 InputStream 固定大小的塊讀取檔案。您可以根據可用記憶體定義塊大小。這是一個例子

public void processLargeFileChunked(String filePath) throws IOException {
  int chunkSize = 1024; <font>// 根據記憶體可用性進行調整<i>
  byte[] buffer = new byte[chunkSize];
  try (InputStream inputStream = new FileInputStream(filePath)) {
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) > 0) {
     
// Process the chunk of data here<i>
    }
  }
}

3、Apache Commons IO – FileUtils.lines:
該庫提供了一種方便的FileUtils.lines方法,可以在有效處理記憶體的同時逐行讀取檔案。它內部使用類似於BufferedReader.

4、Java NIO – Files.lines:
Java NIO 提供了一種現代的方法Files.lines。它使用流逐行讀取檔案,減少記憶體使用。

5、記憶體對映檔案:
此技術利用記憶體對映檔案,它允許您訪問檔案的一部分,就好像它直接對映到記憶體一樣。這種方法可以有效地訪問檔案的特定部分,而無需載入整個檔案。但是,它需要仔細的記憶體管理,並且可能並不適合所有場景。

這裡有一個需要記住的關鍵點:記憶體對映檔案實際上並不將整個檔案載入到記憶體中。相反,它們在檔案區域和記憶體緩衝區之間建立對映。該緩衝區就像一個視窗,允許您按需訪問檔案的特定部分。

6、使用 Apache Commons IO 或 Java NIO 進行流式傳輸:
Apache Commons IO 和 Java NIO 都提供將檔案作為流處理的功能。這使您能夠以塊的形式讀取和處理資料,而無需將整個檔案一次儲存在記憶體中。

  • Apache Commons IO: 像 FileUtils.lines(File file) 這樣的庫提供了一種使用流逐行處理檔案的便捷方法。
  • Java NIO:  Java NIO 中的 Files 類提供了像lines(Path path)這樣的方法來使用流從檔案中讀取行。這種方法對於處理大型文字檔案特別有效。

選擇正確的技術
針對您的具體情況的最佳技術取決於幾個因素:

  • 檔案大小和格式: 對於非常大的二進位制檔案,使用 InputStream 進行分塊可能是理想的選擇。逐行處理適用於文字檔案。
  • 處理需求: 如果您只需要訪問檔案的特定部分,記憶體對映檔案可能是一個選擇。
  • 效能要求: 對不同的技術進行基準測試,看看哪種技術能夠為您的用例提供最佳效能。

相關文章