最近做項目有個功能需要后端將多個圖片文件進行壓縮成zip文件后提供給前端下載的需求,很簡單的實現了該功能,但測試功能時卻發現,該功能壓縮的zip文件下載后解壓居然報錯,報錯信息如圖:
雖然報錯后依舊有正常的文件出現,但既然出現了問題還是要找找並解決了。在百度尋找資料分析后,一番折騰努力,還是解決了這個問題,現在記錄下問題出現的可能原因。
字節流讀取超過實際長度
這種情況我沒有遇到,也沒有去驗證,是網上網友提供的一種可能,僅記錄作為參考分析。這種情況就是在用字節流讀取的時候,采用了固定的長度,不是動態的、隨着字節流讀取長度而變化的正確長度,錯誤代碼如下:
在zos.write時,采用了固定長度2*1024,這個是錯誤的寫法,需修改成如下的正確代碼:
使用len接收in.read真正讀取的長度,再在zos.write寫入是傳入正確的長度len
未清空緩存區直接關閉流連接
這種情況就是我碰到的情況,在緩存區還有數據殘留的時候,未清空緩沖區,而直接關閉了流連接,導致壓縮文件時錯誤。錯誤代碼如圖:
輸出流未清空緩存,就直接關閉,錯誤的寫法,修改后的正確代碼如下圖:
ZipOutputStream在有文件需要壓縮時flush()方法清空緩存區,如果壓縮已完成,調用finish()方法結束壓縮,其他out流只使用flush()方法清空緩沖區
壓縮結束后,流關閉順序錯誤
這種情況是百度網友提供的一種可能,我也未驗證,僅記錄做為參考分析。一般關閉流的規則是:先打開的后關閉,后打開的先關閉;特殊情況根據依賴關系關閉流:流A依賴流B,先關閉流A,再關閉流B。這種情況就是沒有依照流關閉規則,從而導致關閉流的時候出現異常,導致壓縮文件錯誤,不過這種情況只需要調整流關閉順序即可。