簡體   English   中英

處理大文件的正確方法是什么?

[英]What is the proper way to handle large files?

當你需要通過各種方法運行字節時,如何在java中處理大文件?

我以前這樣做的方式是這樣的:

private byte[] inputStreamToByteArray(InputStream inputStream) {
   BufferedInputStream bis = BufferedInputStream(inputStream);
   ByteArrayOutputStream baos = new ByteArrayOutputStream();

   byte[] buffer = new byte[8192];

   int nRead;
   while((nRead = bis.read(buffer)) != -1) {
      baos.write(buffer, 0, nRead);
   } 

   return baos.toByteArray();
}

因為我的字節數組太大,我得到一個java內存不足錯誤。

所以我嘗試將流串聯在一起,但我不確定這是否是正確的方法,因為我對流不夠了解。

是應該使用字節數組中的塊來處理大文件還是通過傳遞輸入流?

是應該使用字節數組中的塊來處理大文件還是通過傳遞輸入流?

應該從8192字節的塊中讀取大文件,就像在示例中一樣。 而不是將數據復制到數組並處理數組,只需在讀取數據時處理數據。

或者:

  1. 通過內存映射文件處理文件。 處理至少2GB大小 - 如果你想要貢獻那么多的內存! 與操作系統本機IO線程和內存緩沖區集成,以提高性能。

      java.nio.MappedByteBuffer buff = file.getChannel.map(); 

    然后訪問緩沖區的各個部分 - 它們將依次分頁到java內存中,所以仍然會發生一些IO分塊。 但從邏輯上講,對於您的程序來說,它看起來好像在處理整個文件(在分頁期間I / O性能有一些抽象泄漏)。

  2. 在讀取它們時處理塊 - 而不是附加到不斷增長的ByteArrayOutputStream。 為了處理塊:讀取足夠大的塊以使它們對您的程序有意義。 或者將這些部分聚合到它們具有意義的點,並且可以在下次讀取之前對其進行處理和丟棄。

通常(2)表現良好,但(1)表現良好,偶爾更簡單,但內存更昂貴。

另請參閱: 使用Java讀取文件或流的最強大方法(防止DoS攻擊)

:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM