项目场景

项目上需要将多个文件压缩成一个压缩包下载

问题描述

下载下来的压缩包用360压缩解压可以解压成功(但是如果压缩文件的最后是一个空文件夹的话,解压出来不是一个空文件夹,而是一个识别不出来文件格式的文件)

用WinRAR解压失败

原因分析

字节输出流和压缩输出流的关闭顺序问题,压缩输出流未将完整数据流输出到字节输出流,字节输出流即被关闭

解决方案

public ResponseEntity<byte[]> fileBatchDownLoad(...) {...//字节数组输出流构造ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//压缩输出流在字节数组输出流的基础上构造ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream);List<InputStream> inputStreamList = ... //获取输入流for (int i = 0; i < inputStreamList.size(); i++) {InputStream inputStream = inputStreamList.get(i);byte[] buffer = new byte[1024];int len;ZipEntry entry = new ZipEntry(fileNames.get(i));try (BufferedInputStream in = new BufferedInputStream(inputStream)) {//获取需要下载的文件流zipOutputStream.putNextEntry(entry);//文件流循环写入ZipOutputStreamwhile ((len = in.read(buffer)) != -1) {zipOutputStream.write(buffer, 0, len);}inputStream.close();zipOutputStream.closeEntry();} catch (Exception e) {e.printStackTrace();}}try {//先关闭压缩输出流,再关闭字节数组输出流,否则生成的压缩文件解压会出错,//虽然360压缩有时候能解压,但是使用WinRAR解压就一定会出错(先构造的后关闭)zipOutputStream.close();byteArrayOutputStream.close();} catch (IOException e) {e.printStackTrace();}if (StringUtils.isEmpty(zipName)) {zipName = "数据";}HttpHeaders headers = new HttpHeaders();headers.setContentDispositionFormData("attachment",  new String((zipName + ".zip").getBytes(), StandardCharsets.ISO_8859_1));headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);return new ResponseEntity<>(byteArrayOutputStream.toByteArray(), headers, HttpStatus.OK);}

java压缩文件流解压出错相关推荐

  1. 通过文件流解压压缩包

    最近在做文件解压遇到个问题,记录下解决过程. 文件来源是通过接口获取文件流,然后通过文件流解压文件. 此时需要将文件流写入文件然后对文件进行操作, 遇到的问题是怎么创建合格File对象,搜索了很长时间 ...

  2. 最近很火的在线文件预览txt、doc、ppt、pdf、excel、jpg、png、zip、tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写搜索引擎多关键词检索名称和内容(五)

    最近很火的在线文件预览txt.doc.ppt.pdf.excel.jpg.mp4.png.zip.tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写一个文件搜索引擎实现多关键词 ...

  3. linux下tar gz bz2 tgz z等众多压缩文件的解压方法

    对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见 的压缩文件就只有两种,一是,zip,另一个是.rar. ...

  4. 最近很火的在线文件预览txt、doc、ppt、pdf、excel、jpg、png、zip、tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写搜索引擎多关键词检索名称和内容(四)

    最近很火的在线文件预览txt.doc.ppt.pdf.excel.jpg.mp4.png.zip.tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写一个文件搜索引擎实现多关键词 ...

  5. Zip压缩文件没有解压密码怎么办?

    Zip压缩文件没有解压密码怎么办? 在平时,我们难免的需要到浏览器上面寻找一些需要的资源,可往往下载好了zip文件后,解压时却需要密码.真的让人很痛苦.那有没有什么办法可以破解zip解压时需要的密码呢 ...

  6. linux解压文件卡住,Linux系统下常见的压缩文件及解压方法

    如果tar不支持j这个参数就先用 bzip2 -d xxx.tar.bz2 把它解压成.tar文件,然后再用 tar xvf xxx.tar 拆包. 压缩解压 linux下怎么解后缀名是gzip的文件 ...

  7. java上传rar文件_java实现上传zip/rar压缩文件,自动解压

    在pom中添加解压jar依赖 4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.2.RELEASE com.hf uncomp ...

  8. java实现上传zip/rar压缩文件,自动解压

    在pom中添加解压jar依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  9. mac java打包文件_解压MAC压缩的zip文件

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import ...

最新文章

  1. ubuntu mysql 改密码_tpcc-mysql 压力测试
  2. Java基础5:final
  3. php程序员应该懂的几个基本概念
  4. 自动编译和提交脚本(结合svn和visual studio)
  5. day②:字典的fromkeys方法
  6. oracle模糊查询很慢,采用全文索引解决模糊查询速度慢的问题
  7. 大数据学习笔记31:Java程序访问高可用Hadoop集群
  8. JAVA-5NIO之Selector
  9. JAVA常见算法题(十九)
  10. 【人脸表情识别】基于matlab LBP+LPQ算法融合人脸表情识别【含Matlab源码 432期】
  11. 程序员的数学【最优化】
  12. 无线传感器部署的连接性架构和协议选项
  13. 面对台风“烟花”,旅行延误会如何赔付?
  14. python-opencv尺寸测量
  15. et文件怎么转成excel_excel怎么转换成word格式的文件格式?这些方法应该掌握!...
  16. 流行病学名词解释和简答题集锦
  17. GPU跑TensorFlow的各种显卡下的电脑配置(1080ti)
  18. 计算机系统盘突然爆满,电脑c盘突然爆满是怎么个情况_电脑c盘和d盘的区别
  19. SSM框架优缺点和springboot 比起优缺点是什么?
  20. 学会4种方法,掌握端到端测试处理数据..

热门文章

  1. Volatile的优缺点
  2. 大数据中物联网架构的相关知识
  3. [渝粤教育] 中国地质大学 微积分(二) 复习题
  4. 进PE系统后看不到硬盘的原因及解决办法
  5. ipxe u盘启动linux内核,[转载]笔记: SYSLINUX PXE gPXE iPXE PXELINUX D
  6. 基于SSM的家庭财务管理系统
  7. 机器学习【西瓜书/南瓜书】--- 第四章决策树
  8. 直线电机的主要参数和选型
  9. 关于软件设计那些事---正交设计
  10. 我的共享软件开发日志