1.有問題的代碼
//根據臨時的zip壓縮包路徑,創建zip文件
File zip = new File(zipFilePath);
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
if (!zip.exists()){
zip.createNewFile();
}
//創建zip文件輸出流 a.注意引用順序
fos = new FileOutputStream(zip);
zos = new ZipOutputStream(fos); //循環讀取文件路徑集合,獲取每一個文件的路徑
for(String fp : fileList){
File f = new File(excelDir, fp); //根據文件路徑創建文件
zipFile(f, zos); //將每一個文件寫入zip文件包內,即進行打包
response.flushBuffer();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try{ //b.注意關閉順序
if(fos != null){
fos.close();
}
if(zos != null){
zos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
按照上面的方式b.關閉代碼會報java.io.IOException: Stream Closed異常;
通常我們的想法時只要關閉工作流就可以了,但有些時候這樣無順序關閉文件流會報異常,那麼產生的原因是什麼?
因爲我在zos文件流中用到了fos文件流,先去關閉fos時,再去關閉zos時,zos關閉時會用到fos,所以會報剛纔說這異常;
更深入的原因參考:https://blog.csdn.net/u014617239/article/details/52252438
解決辦法修改流關閉順序:
if(zos != null){
zos.close();
}
if(fos != null){
fos.close();
}