看下面的代码,如果把输出流的关闭顺序改了,一定会出现“不可预料的压缩文件末端”的问题。

要解决这个问题,就需要正确的关闭流。

1、根据“先开后关”的原则;

2、如果存在外层流包内层流(比如下面的zos),只需要关闭外层流,内层流就会关闭。如果关闭外层流再去关闭内层流,可能会出错;

3、节点流不需要关闭;

节点流和处理流 :按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。
节点流:可以从或向一个特定的地方(节点)读写数据,如FileReader 。
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。节点流:
文件流:FileInputStream ,FileOutputStrean ,FileReader ,FileWriter 文件进行处理的节点流。
父 类 :InputStream ,OutputStream ,Reader, Writer。
字节数组流: ByteArrayInputStream ,ByteArrayOutputStream。
对数组进行处理的节点流,对应的不再是文件,而是内存中的一个数组。常用处理流:
缓冲流:BufferedInputStrean ,BufferedOutputStream, BufferedReader ,BufferedWriter。
(增加缓冲功能,避免频繁读写硬盘,提高性能)
转换流:InputStreamReader OutputStreamReader。
(将字节流转换为字符流)
数据流: DataInputStream ,DataOutputStream
(提供将基础数据类型写入到文件中,或者读取出来)
/*** 测试读取excel并操作excel* 测试excel -> zip* @throws IOException*/@Testpublic void testZip() throws IOException {// copy文件到zip输出流中byte[] buf = new byte[1024];int cnt = 1,len;FileOutputStream out = new FileOutputStream("D:\\test_zip.zip");ZipOutputStream zos = new ZipOutputStream(out);// 1、读取模板--模板图在下面,可以自己画一个FileInputStream fileIn = new FileInputStream("D:\\test.xls");// 获取excel对象HSSFWorkbook wb = new HSSFWorkbook(fileIn);// 读取第一个sheet页HSSFSheet sheet = wb.getSheetAt(0);// 模拟循环10次,压缩10个excel到压缩包里面for (int i = 0; i < 10; i++) {// 2、填写数据// 获取第1行,第1列的单元格,然后填写数据// 一个excel有多个sheet// 一个sheet有多个row// 一个row有多个cell//  HSSFRow row = sheet.getRow(0);//  HSSFCell cell = row.getCell(0);//  cell.setCellValue("【2020】年【"+(cnt)+"】月");// 下面这一行与上面三行等价sheet.getRow(0).getCell(0).setCellValue( "【2020】年【"+(cnt)+"】月" );// 3、保存到输出流ByteArrayOutputStream fileOut = new ByteArrayOutputStream();wb.write(fileOut);// 4、输出流转换成输入流byte[] content = fileOut.toByteArray();ByteArrayInputStream is = new ByteArrayInputStream(content);BufferedInputStream in = new BufferedInputStream(is);// 5、放到压缩流--填写待文件的名称zos.putNextEntry(new ZipEntry("test-wdq"+(cnt++)+".xls"));while ((len = in.read(buf)) != -1) {zos.write(buf, 0, len);}// 关闭流的顺序不能变,遵从"先开后关"的原则// 关闭流的顺序不对,会导致压缩包的文件损坏zos.flush();fileOut.close();zos.closeEntry();}// 关闭流的顺序不能变,遵从"先开后关"的原则wb.close();zos.close();out.close();}

使用zip,出现“不可预料的压缩文件末端”问题相关推荐

  1. 已解决解压zip文件,抛出异常:不可预料的压缩文件末端的正确解决方法(亲测有效)

    已解决解压zip文件,抛出异常:不可预料的压缩文件末端的正确解决方法(亲测有效) 文章目录 报错问题 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错 报错问题 粉丝群里面的一个小伙伴遇到 ...

  2. 使用Java生成的ZIP压缩包解压时出现不可预料的压缩文件末端的解决方案

    使用Java生成的ZIP压缩包解压时出现不可预料的压缩文件末端的解决方案 问题描述: 如下图所示,在解压Java程序生成的ZIP压缩包时出现不可预料的压缩文件末端, 问题分袖: 出现上面的情况,大概有 ...

  3. Java多word文件生成后进行压缩并导出下载后,压缩文件损坏并提示“不可预料的压缩文件末端”和“CRC校验失败”

    Java多word文件生成后进行压缩并导出下载后,压缩文件损坏并提示"不可预料的压缩文件末端"和"CRC校验失败" WinRAR 打开情况: 提示不可预料的压缩 ...

  4. ZipOutputStream 生成压缩文件,用winrar打开后报”不可预料的压缩文件末端”错误

    问题产生的原因:可能是用到文件流未正确关闭 解决办法是:1.检查待压缩文件的流是否都正常关闭,且按顺序 2.生成压缩文件的过程中用到的流是否正常关闭,且按顺序 try {File zipFile = ...

  5. 前端下载流zip包,前端导出流压缩文件文件

    今天遇到了个需求,需要从后端拿值下载zip压缩包到本地,后端给的格式是二进制流的,面对百度开发了下,发现都不大行,自己琢磨了下,写了个post下载的方法 import axios from 'axio ...

  6. java将文件夹压缩成zip java按照目录结构压缩文件夹

    前言 用java将文件夹压缩成zip包,像压缩软件一样,按照目录结构压缩(包含当前文件夹) 网上没有找到太合适的,借鉴其它帖子,自己写了一个 代码 package xin.yangshuai.myba ...

  7. java创建的zip无法打开或打开显示不可预料的压缩文件

    问题出现 问题来源是我做的一个文件导出功能 java创建zip文件,结果在我的电脑上能够打开,在同事的mac或者未安装360压缩的电脑上打不开,然后我就分析应该是代码创建的这个文件有问题,可能360压 ...

  8. CentOS7下zip解压和unzip压缩文件

    1.安装zip.unzip应用. yum install zip unzip 2.压缩和解压文件 以下命令均在/home目录下操作 cd /home #进入/home目录 a.把/home目录下面的m ...

  9. Linux kali系统使用fcrackzip/rarcrack破解zip/rar(或者zip 7z)类型的加密压缩文件

    一. fcrackzip工具 1.首先得有有zip加密的文档 zip -P 12345  demozip.zip 2再使用fcrackzip工具 密码就出来了 3.也可以指定字典来进行查找,字典可以是 ...

最新文章

  1. 程序员敲代码时,戴着耳机究竟在听什么?
  2. ValueError: operands could not be broadcast together with shapes解决
  3. 蓝桥杯java 算法提高 摆花
  4. 小型数控雕刻机制作Arduino_开一家全屋定制装修公司,怎么选择开料机与雕刻机?...
  5. Rxjs Observable.pipe 传入多个 operators 的执行逻辑分析
  6. java自学报告_Vi,Java,Ant和Junit自学报告
  7. 解决mac 系统软件被阻止载入点允许没反应的问题
  8. Linux系统的各种安装方法与修复技巧
  9. poj 2063 Investmen 完全背包
  10. linq 动态拼接where条件 类似 T_SQL And Or
  11. Windows核心编程(笔记13) 第十六章--第二十六章
  12. PowerPoint 蜜蜂跳“8”字舞实例
  13. 【One by one系列】一步步部署.net core应用
  14. Linux Mint 双系统安装教程
  15. Unity 对话气泡
  16. 数据结构—约瑟夫环问题(C语言版)
  17. 10.网桥是什么?网桥和路由器及交换机的区别?以太网和令牌环网,nat,查公网ip等
  18. e代驾——打造代驾服务标准化平台
  19. 用c语言写一个简易的四则运算计算器
  20. 怎么实现边下载边播放

热门文章

  1. 智慧校园-实验室预约介绍
  2. 本以为PlusFo是个青铜,没想到竟是个王者
  3. 获取网站的浏览器上的icon图标
  4. CSS中含有特定文字的选择器
  5. Python基础 | Python的组合数据类型
  6. 基本数据类型和引用类型
  7. python中str.center()的功能是什么_Python str内部功能介绍
  8. python+PIL批量制作淘宝主图(头图)及满屏水印添加
  9. SPM12入门案例1
  10. HTML表单验证(含用户名,密码,邮箱,手机号,验证码-验证)