我想要解压一个目录下的三个文件,其中一个是Excel两个是pdf文件,但是利用代码解压出来后Excel会损坏,文件大小比源文件小,pdf文件可以正常打开但是会损失一些莫名的画面

比如我的pdf是合同,里面竟然有字但是公司盖的章就没有了,这是代码问题!

解决办法:
我是同一个方法中先生成了3个文件紧接着就调用解压方法去解压这三个文件,其实这是不对的。
我们应该先关闭生成这3个文件的流,在close()的时候会自动调用flush()刷新缓冲区,这样子我们会保证文件的完整性。
这时候再调用解压缩文件的方法,至于解压缩的close就在解压缩方法中关闭即可!

最后提一嘴,在循环new一个流的时候,一定要在循环中close()!

关闭一个流就必须用一个try-catch,不要为了省事用一个try-catch关闭所有流,不然如果前面的流报错了,后面的流是无法关闭的!

解决问题之前我的代码步骤如下:
1.生成三个文件
2.解压缩
3.finally中关闭三个文件用到的应该关闭的流

解决问题之后我的步骤:
1.生成三个文件
2.不用finally,一个try-catch关闭一个流,关闭三个文件用到的所有流
3.调用解压缩方法(解压缩的流在解压缩方法中关闭)

下面是我查找资料找到的解压缩方法,需要的同学直接copy吧. ↓↓↓↓↓↓↓

/*** * @param sourceFilePath 需要压缩的文件夹* @param zipFilePath 压缩包的存放位置* @param fileName  压缩包名称* @return*/// 不能压缩单独文件,文件夹中没有东西也不行!必须压缩一个文件夹,有特殊需要就自己修改一下代码。public static boolean fileToZip(String sourceFilePath, String zipFilePath, String fileName) {boolean flag = false;File sourceFile = new File(sourceFilePath);FileInputStream fis = null;BufferedInputStream bis = null;FileOutputStream fos = null;ZipOutputStream zos = null;if (!sourceFile.exists()) {} else {try {File zipFile = new File(zipFilePath + "/" + fileName + ".zip");if (zipFile.exists()) {return true;} else {File[] sourceFiles = sourceFile.listFiles();if (null == sourceFiles || sourceFiles.length < 1) {//                      System.out.println(”待压缩的文件目录:” + sourceFilePath + “里面不存在文件,无需压缩.”);} else {fos = new FileOutputStream(zipFile);zos = new ZipOutputStream(new BufferedOutputStream(fos));byte[] bufs = new byte[1024*10];for (File file : sourceFiles) {//创建ZIP实体,并添加进压缩包ZipEntry zipEntry = new ZipEntry(file.getName());zos.setLevel(9);zos.putNextEntry(zipEntry);//读取待压缩的文件并写进压缩包里fis = new FileInputStream(file);bis = new BufferedInputStream(fis, 1024 * 10);int read = 0;while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {zos.write(bufs, 0, read);}//一定在循环中关闭流,不然流会出现关闭不全的情况!!!bis.close();}flag = true;}}} catch (IOException e) {e.printStackTrace();throw new RuntimeException(e);} finally {//关闭流,不要图省事,一定要一个try-catch对应关闭一个流!//最后开的流最先关,就按照这个顺序关闭!不懂的看我代码顺序摸索一下。//Buffered这种流如果里面包含了其他流//比如我这段bis对象包含了fis,就只需要关闭bis流即可!//因为它会调用fis的close(),会把自己的儿子也关了,这个你不用操心了!try {if (null != bis) {bis.close();}} catch (IOException e) {e.printStackTrace();}try {if (null != zos) {zos.close();}} catch (IOException e) {e.printStackTrace();}}}return flag;}

Java io流 解压缩多个文件 损坏问题解决相关推荐

  1. java IO流(一)文件, InputStream,OutputStream,Reader,Writer

    JAVA IO流(一) (一) 文件 1.概念 文件就是保存数据的地方 文件流 文件在程序中是以流的形式来操作的. java程序(内存) <--------> 文件(磁盘) 输入,输出是针 ...

  2. JAVA~~IO流和文件

    ​​​​​​​​ Io流的分类 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物, 往内存中去,叫做输入(Input).或者叫做读(Read). 从内存中出来,叫做输出(Outpu ...

  3. Java读取文件流用什么对象_使用Java IO流实现对文本文件的读写过程中,通常需要处理下列( )异常。_学小易找答案...

    [论述题]请根据第一次平时作业的选题,结合第二次课内容,自拟一个论文提纲. [单选题]在 switch ( expression )语句中, expression 的数据类型不能是 ( ) [单选题] ...

  4. java io流(字符流) 文件打开、读取文件、关闭文件

    java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*;public class Index{public stati ...

  5. java io流 教程_Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...

  6. Java io流---拷贝文件夹下的所有文件和目录

    Java io流-拷贝文件夹下的所有文件和目录 代码: package demo01;import java.io.*; import java.util.TreeMap;public class C ...

  7. java io flush_《文件传输基础——Java IO流》,对其中flush方法的思考

    在学习了<文件传输基础--Java IO流> 课程后,发现自己对flush()方法的调用有很多疑惑.在查询资料和自己看源码以及动手试验之后发现有以下几个特点.如有误也请大家指正出来,一切为 ...

  8. java 弹出另存为_java如何实现 io流传输过来的文件,提示另存为弹出窗口?

    java如何实现 io流传输过来的文件,提示另存为弹出窗口? mip版  关注:166  答案:6  悬赏:0 解决时间 2021-01-24 22:00 已解决 2021-01-24 11:06 最 ...

  9. java io流过滤流_JAVA io流 文件流 字节流 字符流 过滤流 缓冲流

    一.概念 1.1.按流向分类: 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 1.2.按数据传输单位分类: 字节流:以字节(8位二进制)为单位进行处理.主要用于读写诸如图 ...

最新文章

  1. JavaScript 之 特殊运算符
  2. 为什么发了个博客分分钟被各种网站花式转载=。=而不通知我
  3. GDCM:二个DICOM文件的diff差异的测试程序
  4. PHP面向对象(OOP)编程入门教程
  5. python安装pyinstaller库_python pyinstaller安装
  6. Mozilla Firefox 10.0 beta4 发布
  7. 混凝土墙开洞_新乐专业混凝土切割报价适中
  8. 基于Redis实现简单的分布式锁
  9. 用C语言编写猴子选大王程序(数据结构)
  10. 搜狗AI,正在抢滩智能手机
  11. 1. Windows网络编程(C++ Socket编程)
  12. Kaggle 大师访谈:我的 ML 竞赛之旅
  13. 相关性分析及SPSS软件操作
  14. 数据分析十年来电影票房数据
  15. sqlServer2014用sql server身份认证登录
  16. 利用最小二乘法进行参数估计
  17. 勇敢面对人生的苦难,时光不负赶路人
  18. 高德地图嵌入到threejs全景中的踩坑指南
  19. 68000多只海洋动物、占地18.3万平米,这才是全球最大海洋水族馆该有的气势!...
  20. linux无法运行sssverify,Synopsys Design Compiler在fedora Core 9下面的安装

热门文章

  1. 服装扣件行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  2. python爬虫win10程序_Python爬虫教程:批量提取Win10锁屏壁纸
  3. uni-app的学习及使用
  4. php 无限子站cms,PHP整理CMS无限层级目录(毗邻目录模式)
  5. 如何通过虚拟机和真实网线调试设备
  6. 浙江移动盒子魔和m401h 2+8G破解使用网络安装软件
  7. 孙鑫VC++深入详解第三章学习笔记
  8. GITC2016花落上海,五大亮点抢先看
  9. cp7s2装Linux,基礎級拆機-神舟戰神GX8CP5s1上8700發現較為雞肋-仿CP7s2
  10. java 参数不知道类型_java – 类型参数不在其范围内