zipoutputstream 进行解压缩时winrar提示:不可预料的压缩文件末端

在做javaweb导出zip文件时,360压缩软件可以正常解压。但是winrar软件却报:不可预料的压缩文件末端 错误。在网上搜刮了许久,基本上解决方法是下以下两种:

一、输出流是否关闭,关闭顺序是否正确。先打开的后关闭。
二、是否调用ZipOutputStream的close()方法

closeEntry()方法是在putNextEntry()方法后调用。一般是在循环中使用。
最后需要调用close方法。
这两点。我排查了许久,仍然没有解决。
继续Google,发现博主zh521zh 写的一句话:

close方法必须在其他地方使用之前关闭

而我却是在ServletOutputStream 赋值之后才调用close方法。于是乎,方法提前,果真完美解决了问题!
启示:输出流不用之后及时关闭。

有效代码:

        response.reset(); // 非常重要
        FileInputStream fileInputStream = null;
        File returnFile = null;
        int pageSize=5000;
        String path= PropertiesFactory.getUploadProp().getProperty("localFileUrl");
   
			String absoZipPath = path+File.separator +".zip";
            FileOutputStream fo = new FileOutputStream(absoZipPath);
            ZipOutputStream zipout = new ZipOutputStream(fo);       
            byte[] buffer = new byte[1024];    
			int page = num/pageSize;
			for(int i=0;i<=page;i++){
				File returnFile = null;
				ZipEntry ze = new ZipEntry(returnFile.getName());
				zipout.putNextEntry(ze);
				FileInputStream fis = new FileInputStream(returnFile);
				int len=0;
				// 读入需要下载的文件的内容,打包到zip文件
				while ((len = fis.read(buffer, 0, buffer.length)) != -1) {
					zipout.write(buffer, 0, len);
				}
				zipout.flush();
				fis.close();
				zipout.closeEntry();
			}
			zipout.close();
            fo.close();//关键
			....
			ServletOutputStream out = null;
			String filename = "";
			Locale locale = request.getLocale();
			String userAgent = request.getHeader("user-agent");
			if (userAgent != null && userAgent.contains("Trident") && locale != null
					&& "zh".equalsIgnoreCase(locale.getLanguage()) && "CN".equalsIgnoreCase(locale.getCountry())) {
				filename = new String(returnFile.getName().getBytes("GB18030"), "ISO8859-1");
			} else {
				filename = new String(returnFile.getName().getBytes("UTF-8"), "ISO8859-1");
			}
			response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment; filename=" + filename);
			out = response.getOutputStream();
            IOUtils.copy(fileInputStream, out);
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
ZipOutputStream 是 Java 提供的一个用于压缩文件的类,它可以将数据写入到 ZIP 文件中。在正常情况下,ZipOutputStream 的行为是可预测的。然而,如果在使用 ZipOutputStream 进行压缩操作出现异常或错误,可能会导致其行为变得不可预测。 以下是一些可能导致 ZipOutputStream 不可预测行为的情况: 1. 文件写入错误:如果在写入文件内容发生错误,可能会导致部分数据丢失或损坏。这可能会影响 ZIP 文件的完整性和可用性。 2. 文件路径问题:如果在创建 ZipEntry 使用了无效或非法的文件路径,可能会导致 ZipOutputStream 出现意外行为。这可能包括无法读取、写入或压缩文件。 3. 写入顺序问题:如果不按照正确的顺序将文件写入到 ZipOutputStream 中,可能会导致 ZIP 文件中的文件顺序混乱或错误。 4. 异常处理问题:如果在处理异常没有适当地关闭 ZipOutputStream,可能会导致资源泄露或其他问题。确保在发生异常正确地关闭流是很重要的。 为了避免这些问题,建议在使用 ZipOutputStream 进行压缩操作遵循以下几点: - 在写入文件内容之前检查文件是否存在,并确保文件路径是有效的。 - 使用 try-with-resources 或手动关闭 ZipOutputStream 来确保在完成操作后正确关闭流。 - 在处理异常采取恰当的措施,如记录错误日志、回滚操作或者中断程序的执行。 通过遵循这些最佳实践,可以减少 ZipOutputStream 不可预测行为的可能性,并确保压缩操作的安全和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值