2012-01-17 34 views
0

我有一個Java應用程序,它使用URL獲取相對較小的.zip文件,將其保存在臨時目錄中,將其解壓到本地計算機並對其中一個文件進行一些更改。這一切都很好。Java:處理輸入流中的大文件

不過,我通過BufferedInputStream通過以下方式訪問.zip文件:

Url url = "http://somedomain.com/file.zip"; 
InputStream is = new BufferedInputStream(url.openStream(), 1024); 

我擔心的是,這個應用程序將實際用於傳輸非常zip文件,我在想,如果一個BufferedInputStream實際上是做這件事的最好方法,或者我是否最終會拋出某種類型的OutOfMemoryException

所以我的問題是,BufferedInputStream是否適合這項工作,或者我應該以完全不同的方式去解決它?

+0

您可能想使用庫來處理這個問題。文件上傳是一個簡單的DOS入口點。看看Apache Commons Fileupload中的FileUpload類。 – Perception 2012-01-17 15:28:34

+1

@Perception他在哪裏上傳?他只是下載文件並將其解壓縮。 – Viruzzo 2012-01-17 15:30:27

+0

@維魯佐 - 採取的一點。他描述的過程聽起來非常像文件上傳,儘管在我的評論中文件*傳輸*將是更合適的術語。 – Perception 2012-01-17 15:33:30

回答

5

BufferedInputStream不會將所有文件加載到內存中,它只使用內部緩衝區,在您的情況下大小爲1024字節= 1kb。它永遠不會比這更大。如果你一次不會有很多流,你實際上可以增加價值。

編輯:你在想什麼可能是ByteArrayOutputStream,其中數據保存在內存中。

+0

謝謝,你的回答和鏈接真的很有幫助。這個流應該是唯一一次運行,所以我會考慮增加尺寸。 – 2012-01-17 15:38:34

+0

關於你的編輯,我認爲你是對的 - 我在處理inputstreams時遇到了內存不足錯誤(因此我擔心),並且我認爲我實際上正在使用'ByteArrayOutputStream'。 – 2012-01-17 15:45:04

1

這取決於您對所閱讀的內容所做的操作。如果你在內存中讀取所有內容,它將會失敗。如果你把它寫入另一個流,那就沒問題了。使用BufferedInputStream

+0

「將其保存在臨時目錄中」,以便將其寫入磁盤。 – Viruzzo 2012-01-17 15:31:22

+0

非常好,謝謝。 – 2012-01-17 15:39:04

1

從官方Java Tutorials - Buffered Streams

所以Java平臺實現緩衝I/O流。緩衝輸入 流從稱爲緩衝區的存儲區讀取數據;僅在緩衝區爲空時調用本機 輸入API。同樣,緩衝區 輸出流將數據寫入緩衝區,並且僅在緩衝區滿時調用本地輸出API爲 。

還有一個很棒的SUN article

所以答案是:BufferedInputStream適合這種工作的表現。

是的,內存消耗不是很大程度上依賴於輸入流的類型....

+0

+1感謝您的回答和支持鏈接! – 2012-01-17 15:47:39