[英]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字節的塊中讀取大文件,就像在示例中一樣。 而不是將數據復制到數組並處理數組,只需在讀取數據時處理數據。
或者:
通過內存映射文件處理文件。 處理至少2GB大小 - 如果你想要貢獻那么多的內存! 與操作系統本機IO線程和內存緩沖區集成,以提高性能。
java.nio.MappedByteBuffer buff = file.getChannel.map();
然后訪問緩沖區的各個部分 - 它們將依次分頁到java內存中,所以仍然會發生一些IO分塊。 但從邏輯上講,對於您的程序來說,它看起來好像在處理整個文件(在分頁期間I / O性能有一些抽象泄漏)。
在讀取它們時處理塊 - 而不是附加到不斷增長的ByteArrayOutputStream。 為了處理塊:讀取足夠大的塊以使它們對您的程序有意義。 或者將這些部分聚合到它們具有意義的點,並且可以在下次讀取之前對其進行處理和丟棄。
通常(2)表現良好,但(1)表現良好,偶爾更簡單,但內存更昂貴。
另請參閱: 使用Java讀取文件或流的最強大方法(防止DoS攻擊)
:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.