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();
}