加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Java使用ZipEntry 读取/解压 ZIP包中 多个/指定 文件与源文件不同的错误

(2016-03-16 13:44:31)
标签:

java

io

分类: Java

问题场景:

代码是想把ZIP中的所有文件都解压出来(没有目录结构所以遇到目录不作处理),想法挺简单的,单个文件也不大,就直接zis.read()一次就把单个文件全读出来:

 

ZipInputStream zis = new ZipInputStream(fileInputStream);

while ((entry = zis.getNextEntry()) != null) {

         String entryName = entry.getName();

         int size = (int) entry.getSize();

         byte buf[] = new byte[size];

         if (entry.isDirectory()) { // 如果是目录

                   continue;

         }

         zis.read(buf, 0, size);

}

 

结果发现读出的文件的MD5和原来的文件不一致,说明读错了。出错的文件是最大的那个文件。于是写了个非常难看的代码,试图逐1024个字节读出:

 

ZipInputStream zis = new ZipInputStream(fileInputStream);

while ((entry = zis.getNextEntry()) != null) {

         String entryName = entry.getName();

         int size = (int) entry.getSize();

         byte buf[] = new byte[size];

         if (entry.isDirectory()) { // 如果是目录

                   continue;

         }

         int off = 0;

         while(off < size){

                   if(off + 1024 < size){

                            zis.read(buf, off, 1024);

                            off += 1024;

                   } else{

                            zis.read(buf, off, size - off);

                            break;

                   }

         }

}

 

结果还是不对,调试后发现那个最大的文件读到一定位置之后,后面的全是’0’,而将1024减少到1则不会出错(大于1都会出错)。

 

错误原因:

是由于zis.read(buf, off, 1024),即使指定一次读1024个字节而且剩余entry字节数大于1024的情况下,读取出的字节数也可能小于1024个。

代码改为:

ZipInputStream zis = new ZipInputStream(fileInputStream);

while ((entry = zis.getNextEntry()) != null) {

         String entryName = entry.getName();

         int size = (int) entry.getSize();

         byte buf[] = new byte[size];

         if (entry.isDirectory()) { // 如果是目录

                   continue;

         }

         byte[] bs = new byte[1024];

         int len = 0;

         int off = 0;

         while((len = zis.read(bs)) != -1){

                   System.arraycopy(bs, 0, buf, off, len);

                   off += len;

         }

}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有