簡體   English   中英

FileOutputStream與ByteArrayOutputStream

[英]FileOutputStream vs ByteArrayOutputStream

我正在讀別人的代碼。 這是它的要點。

類使用GZIPInputStream和GZIPOutputStream壓縮和解壓縮文件。

這是壓縮過程中發生的事情的片段。 inputFileoutputFile是類File實例。

FileInputStream fis = new FileInputStream(inputFile);
GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(outputFile));

//the following function copies an input stream to an output stream
IOUtils.copy(fis,gzos);

//outputFile is the compressed file
...

現在,這是解壓過程中發生的事情。

GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(inputFile));
ByteArrayOutputStream baos = new ByteArrayOutputStream();

//copies input stream to output stream
IOUtils.copy(gzis,baos);

//this method does as its name suggests
FileUtils.writeByteArrayToFile(outputFile, baos.toByteArray());

//outputFile is the decompressed file
...

原始程序員在壓縮期間選擇FileOutputStream和解壓縮期間ByteArrayOutputStream原因是什么? 這讓我很困惑。

除非有充分的理由,否則我認為我正在改變它們,以避免將來混淆。 這是一個好主意嗎?

嘿,聽起來像他們復制和粘貼來自不同來源的代碼? :-P不,嚴重的是,除非您需要檢查解壓縮的數據,否則您可以使用BufferedOutputStream進行壓縮和解壓縮。

ByteArrayOutputStream占用的內存更多,因為它將整個內容存儲在Java的內存中(以byte[]風格)。 FileOutputStream直接寫入磁盤,因此占用的內存較少。 在這種特殊情況下,我沒有看到任何明智的理由使用ByteArrayOutputStream 之后不會修改單個字節。 之后它只會被寫入文件。 因此,這是一個不必要的中間步驟。

程序員在壓縮期間使用FileInputStream並在解壓縮時使用緩沖區。 我認為原因是,如果你在讀取文件失敗,那么沒有什么不好的事情發生。 你只是失敗並拋出異常。

如果在解壓縮時失敗並且您已經開始寫入文件,則文件已損壞。 所以他決定先寫緩沖區,然后在解壓縮完成后寫入磁盤上的緩沖區。 如果您處理相對較小的文件,此解決方案是可以的。 否則這需要很多內存並且可能產生OutOfMemeoryError。

我將zip直接解壓縮到臨時文件,然后將臨時文件重命名為其永久名稱。 最后塊應該關心刪除臨時文件。

ByteArrayOutputStream會給他/她一個不錯的OutOfMemoryError嗎?

說真的,他們可能在不同的時間完成。 如果可以,我會查閱VCS日志。

暫無
暫無

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

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