记录一次使用ZIP压缩文件并下载后解压报错的异常问题

  最近做项目有个功能需要后端将多个图片文件进行压缩成zip文件后提供给前端下载的需求,很简单的实现了该功能,但测试功能时却发现,该功能压缩的zip文件下载后解压居然报错,报错信息如图:

 

 

   虽然报错后依旧有正常的文件出现,但既然出现了问题还是要找找并解决了。在百度寻找资料分析后,一番折腾努力,还是解决了这个问题,现在记录下问题出现的可能原因。

字节流读取超过实际长度

  这种情况我没有遇到,也没有去验证,是网上网友提供的一种可能,仅记录作为参考分析。这种情况就是在用字节流读取的时候,采用了固定的长度,不是动态的、随着字节流读取长度而变化的正确长度,错误代码如下:

 

   在zos.write时,采用了固定长度2*1024,这个是错误的写法,需修改成如下的正确代码:

 

  使用len接收in.read真正读取的长度,再在zos.write写入是传入正确的长度len 

未清空缓存区直接关闭流连接

  这种情况就是我碰到的情况,在缓存区还有数据残留的时候,未清空缓冲区,而直接关闭了流连接,导致压缩文件时错误。错误代码如图:

 

  输出流未清空缓存,就直接关闭,错误的写法,修改后的正确代码如下图:

 

   ZipOutputStream在有文件需要压缩时flush()方法清空缓存区,如果压缩已完成,调用finish()方法结束压缩,其他out流只使用flush()方法清空缓冲区

压缩结束后,流关闭顺序错误

  这种情况是百度网友提供的一种可能,我也未验证,仅记录做为参考分析。一般关闭流的规则是:先打开的后关闭,后打开的先关闭;特殊情况根据依赖关系关闭流:流A依赖流B,先关闭流A,再关闭流B。这种情况就是没有依照流关闭规则,从而导致关闭流的时候出现异常,导致压缩文件错误,不过这种情况只需要调整流关闭顺序即可。

posted @ 2020-09-23 11:34  思无  阅读(2404)  评论(0编辑  收藏  举报