[英]Write ByteArrayOutputStream to FileOutputStream vs Write ByteArray to FileOutputStream?
[英]FileOutputStream vs ByteArrayOutputStream
我正在讀別人的代碼。 這是它的要點。
類使用GZIPInputStream和GZIPOutputStream壓縮和解壓縮文件。
這是壓縮過程中發生的事情的片段。 inputFile
和outputFile
是類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.