解压zip压缩包中的指定文件(害死人的错误)

使用Java 解压zip压缩包中的指定文件时遇到了问题。

且听我细细道来:

主要方法如下:

Java代码  

  1. public static byte[] getContent2(final ZipFile zipFile, final ZipEntry zipEntry)  
  2.             throws IOException {  
  3.         InputStream inputStream = zipFile.getInputStream(zipEntry);  
  4.         int length = inputStream.available();  
  5.         byte[] bytes = new byte[length];  
  6.         inputStream.read(bytes);  
  7.         inputStream.close();  
  8.         return bytes;  
  9.     }  

 测试方法如下:

Java代码  

  1. @Test  
  2.     public void test_getContent() throws ZipException, IOException{  
  3.         String outPutFileStr="d:\\Temp\\a\\test.zip";  
  4.         File file=new File(outPutFileStr);  
  5.         ZipFile zipFile = new ZipFile(file);  
  6.         ZipEntry zipEntry = zipFile.getEntry("BaiduYunGuanjia_2.1.022333.exe");  
  7.         byte[]bytes=ZipUtil.getContent2(zipFile, zipEntry);  
  8.         FileUtils.writeBytesToFile(bytes, "d:\\Temp\\a\\baidu.exe");  
  9.     }  

 说明:d:\\Temp\\a\\test.zip是zip压缩包,其中包含文件BaiduYunGuanjia_2.1.022333.exe。我解压的步骤是这样的:

我先通过ZipUtil.getContent2 方法获取BaiduYunGuanjia_2.1.022333.exe 的字节数组,再把该字节数组写入文件d:\\Temp\\a\\baidu.exe。

执行完之后,发现解压的文件不正确,也就是d:\\Temp\\a\\baidu.exe 与BaiduYunGuanjia_2.1.022333.exe的MD5不同。

问题到底出在哪里呢?

getContent2 方法我反复看了无数遍,也没有看出问题。

 

后来终于找到了原因:getContent2方法的第四行得到的length,但是第六行inputStream.read(bytes);读取的字节数并不是length。可以通过inputStream.read(bytes)的返回值获取真正读取的字节个数。

解决方法:

getContent2改进如下:

Java代码  

  1. /** 
  2.      * 从zip包中读取给定文件名的内容 
  3.      *  
  4.      * @param zipFile 
  5.      * @param zipEntry 
  6.      * @return 
  7.      * @throws IOException 
  8.      */  
  9.     public static byte[] getContent(final ZipFile zipFile,  
  10.             final ZipEntry zipEntry) throws IOException {  
  11.         InputStream inputStream = zipFile.getInputStream(zipEntry);  
  12.         byte[] buffer = new byte[1024];  
  13.         byte[] bytes = new byte[0];  
  14.         int length;  
  15.         while ((length = (inputStream.read(buffer))) != -1) {  
  16.             byte[] readBytes = new byte[length];  
  17.             System.arraycopy(buffer, 0, readBytes, 0, length);  
  18.             bytes = SystemUtil.mergeArray(bytes, readBytes);  
  19.         }  
  20.         inputStream.close();  
  21.         return bytes;  
  22.     }  

 测试方法:

Java代码  

  1. @Test  
  2.     public void test_getContent() throws ZipException, IOException{  
  3.         String outPutFileStr="d:\\Temp\\a\\test.zip";  
  4.         File file=new File(outPutFileStr);  
  5.         ZipFile zipFile = new ZipFile(file);  
  6.         ZipEntry zipEntry = zipFile.getEntry("BaiduYunGuanjia_2.1.022333.exe");  
  7.         byte[]bytes=ZipUtil.getContent(zipFile, zipEntry);  
  8.         FileUtils.writeBytesToFile(bytes, "d:\\Temp\\a\\baidu.exe");  
  9.     }  

 

终于ok了。

时间: 2024-08-04 18:31:36

解压zip压缩包中的指定文件(害死人的错误)的相关文章

Linux 下压缩与解压.zip和.rar及.7z文件

对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们: 1)对于.zip linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序.它们的参数选项很多,可用命令zip -help和unzip -help查看,这里只做简单介绍,举例说明一下其用法: # zip yajiu.zip yajiu.jpg yajiu.png 这条命令是将yajiu.jpg和yajiu.png压缩成一个zip包 # zip yajiu.zip *.jpg 这条命令

PHP解压ZIP文件到指定文件夹的方法_php技巧

本文实例讲述了PHP解压ZIP文件到指定文件夹的方法.分享给大家供大家参考,具体如下: /** * function: 解压zip 格式的文件 * author:friker * date:2015-15-14 * reference:http://php.net/manual/zh/ref.zip.php * all rights reserved:wujiangwei123@126.com */ class Unzip{ public function __construct(){ //in

PHP 的解压缩ZipArchive中的extractTo()方法 LINUX+nginx环境中解压zip时文件丢失的问题

    在项目中要用ZipArchive解压ZIP文件,起初测试环境在WINDOWS平台中,测试通过,换到 LINUX+nginx 的环境中时 就出问题了(ZIP包中有文件和文件夹一共3百多个文件,大部分是带汉字的文件名),问题的现象是:不带汉字的文件解压没有问题,另外有部分带汉字和数字字母的文件解压没有问题,然后其他纯文字的文件名就丢失了,也没有报错,最后把问题定位到了extractTo()方法,这个方法尼玛是个封装的方法,看不到实际的源代码.       但是,发现 for($i = 0;

Linux下rar及zip压缩包中批量替换某文件脚本

本需求是自己负责的一个生产系统上,有大量以zip和rar结尾的压缩文件散落在文件系统的各个文件夹,先在需要把压缩包里包含某一个特定文件(如tftpd32.exe或Tftpd32.exe,版本较旧),全都替换成比较新的tftpd32.exe版本.压缩文件总数约5000个,需要替换的数量约1500个. 因为是生产环境,不敢轻易乱动,所以脚本考虑的因素就非常多,不允许中间执行过程出现异常,所以找到文件后实际执行替换操作之前做好备份,并且将操作过程记录日志. 以下几点需要考虑: 分别处理zip和rar文

Ubuntu解压zip文件乱码的解决方法_Linux

前言 本文介绍的是Ubuntu解压zip文件乱码的解决方法,共有2种方式解决问题,下面话不多说,来一起看看吧 一.通过unzip行命令解压,指定字符集 unzip -O CP936 xxx.zip (用GBK, GB18030也可以) 有趣的是unzip的manual中并无这个选项的说明, unzip --help对这个参数有一行简单的说明. 二.在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件 /etc/environment中加入2行 UNZIP="-O CP936&quo

php在线解压ZIP文件的方法

这篇文章主要介绍了php在线解压ZIP文件的方法,包含了较为完整的上传与zip解压功能,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了php在线解压ZIP文件的方法.分享给大家供大家参考.具体分析如下: 在PHP的函数库中只找到了个ZLIB的函数还跟压缩有点关系,但是使我失望的是他没能解ZIP的文件,但最后还是让我找到了解决的方法,就是通过PHP的程序执行函数来实现这个功能,因为现在能解ZIP文件的东西实在是太多啦,你要是不信,可以到有下载软件的地方找找看,保准你不会失望的,我的

c++-[zlib使用问题]如何解压zip文件!求助各位大神,救急!!!

问题描述 [zlib使用问题]如何解压zip文件!求助各位大神,救急!!! 有个项目,要实现Zip文件的解压和压缩,这几天一直在搞zlib,但是不管在Linux下还是Windows下都有问题. 1.linux下我用gcc编译,代码中就直接写了个#include "zlib.h",然后就可以用compress和uncompress函数了,可是我的问题是要用来解压Zip文件啊,并不是压缩字符串,然后就用miniZip文件夹中的zip.h和unzip.h,include到代码中,结果调用里面

支持中文Java压缩与解压zip文件程序代码

apache ant下载地址: http://ant.apache.org/bindownload.cgi 把lib/ant.jar放到我们项目的构建路径中,只需要ant.jar.其实ant的zip API与jdk的高度相似,如果之前是用jdk的api写的,基本上只要更改顶部的import包就可以了  代码如下 复制代码 package common;   import java.io.BufferedInputStream; import java.io.BufferedOutputStrea

ant包解压zip文件。。。。求助。。。。。

问题描述 ant-1.7.1.jar我想指定解压zip包里的文件夹.不要全部解压.请问谁有ant包的帮助文档...求助........ 解决方案 解决方案二:怎么获取zip包里所有的文件夹名称,然后执行遍历解压?解决方案三:http://wenku.baidu.com/view/f56b990d4a7302768e993999.html不知道这个行不行,回头帮你找哈.为什么你自己不去找找呀解决方案四:比如说一个zip包中有10个文件夹遍历出后,我只取其中一个解压到指定的目录..解决方案五:这个真