使用zip,出现“不可预料的压缩文件末端”问题
看下面的代码,如果把输出流的关闭顺序改了,一定会出现“不可预料的压缩文件末端”的问题。
要解决这个问题,就需要正确的关闭流。
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,出现“不可预料的压缩文件末端”问题相关推荐
- 已解决解压zip文件,抛出异常:不可预料的压缩文件末端的正确解决方法(亲测有效)
已解决解压zip文件,抛出异常:不可预料的压缩文件末端的正确解决方法(亲测有效) 文章目录 报错问题 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错 报错问题 粉丝群里面的一个小伙伴遇到 ...
- 使用Java生成的ZIP压缩包解压时出现不可预料的压缩文件末端的解决方案
使用Java生成的ZIP压缩包解压时出现不可预料的压缩文件末端的解决方案 问题描述: 如下图所示,在解压Java程序生成的ZIP压缩包时出现不可预料的压缩文件末端, 问题分袖: 出现上面的情况,大概有 ...
- Java多word文件生成后进行压缩并导出下载后,压缩文件损坏并提示“不可预料的压缩文件末端”和“CRC校验失败”
Java多word文件生成后进行压缩并导出下载后,压缩文件损坏并提示"不可预料的压缩文件末端"和"CRC校验失败" WinRAR 打开情况: 提示不可预料的压缩 ...
- ZipOutputStream 生成压缩文件,用winrar打开后报”不可预料的压缩文件末端”错误
问题产生的原因:可能是用到文件流未正确关闭 解决办法是:1.检查待压缩文件的流是否都正常关闭,且按顺序 2.生成压缩文件的过程中用到的流是否正常关闭,且按顺序 try {File zipFile = ...
- 前端下载流zip包,前端导出流压缩文件文件
今天遇到了个需求,需要从后端拿值下载zip压缩包到本地,后端给的格式是二进制流的,面对百度开发了下,发现都不大行,自己琢磨了下,写了个post下载的方法 import axios from 'axio ...
- java将文件夹压缩成zip java按照目录结构压缩文件夹
前言 用java将文件夹压缩成zip包,像压缩软件一样,按照目录结构压缩(包含当前文件夹) 网上没有找到太合适的,借鉴其它帖子,自己写了一个 代码 package xin.yangshuai.myba ...
- java创建的zip无法打开或打开显示不可预料的压缩文件
问题出现 问题来源是我做的一个文件导出功能 java创建zip文件,结果在我的电脑上能够打开,在同事的mac或者未安装360压缩的电脑上打不开,然后我就分析应该是代码创建的这个文件有问题,可能360压 ...
- CentOS7下zip解压和unzip压缩文件
1.安装zip.unzip应用. yum install zip unzip 2.压缩和解压文件 以下命令均在/home目录下操作 cd /home #进入/home目录 a.把/home目录下面的m ...
- Linux kali系统使用fcrackzip/rarcrack破解zip/rar(或者zip 7z)类型的加密压缩文件
一. fcrackzip工具 1.首先得有有zip加密的文档 zip -P 12345 demozip.zip 2再使用fcrackzip工具 密码就出来了 3.也可以指定字典来进行查找,字典可以是 ...
最新文章
- 程序员敲代码时,戴着耳机究竟在听什么?
- ValueError: operands could not be broadcast together with shapes解决
- 蓝桥杯java 算法提高 摆花
- 小型数控雕刻机制作Arduino_开一家全屋定制装修公司,怎么选择开料机与雕刻机?...
- Rxjs Observable.pipe 传入多个 operators 的执行逻辑分析
- java自学报告_Vi,Java,Ant和Junit自学报告
- 解决mac 系统软件被阻止载入点允许没反应的问题
- Linux系统的各种安装方法与修复技巧
- poj 2063 Investmen 完全背包
- linq 动态拼接where条件 类似 T_SQL And Or
- Windows核心编程(笔记13) 第十六章--第二十六章
- PowerPoint 蜜蜂跳“8”字舞实例
- 【One by one系列】一步步部署.net core应用
- Linux Mint 双系统安装教程
- Unity 对话气泡
- 数据结构—约瑟夫环问题(C语言版)
- 10.网桥是什么?网桥和路由器及交换机的区别?以太网和令牌环网,nat,查公网ip等
- e代驾——打造代驾服务标准化平台
- 用c语言写一个简易的四则运算计算器
- 怎么实现边下载边播放