java:Zip Exception无效代码长度?

Posted

技术标签:

【中文标题】java:Zip Exception无效代码长度?【英文标题】:java: Zip Exception invalid codes length? 【发布时间】:2013-10-28 09:41:37 【问题描述】:

当我将条目写入这样的 zip 文件时:

ZipEntry ze = zin.getNextEntry();
while (ze != null) 
InputStream is = zf.getInputStream(ze);
zos.putNextEntry(ze);
int len;
while ((len = is.read(buffer)) >= 0) 
   zos.write(buffer, 0, len);


zos.closeEntry();
ze = zin.getNextEntry();


我在第二个 while 循环中得到以下异常:

java.util.zip.ZipException: invalid code lengths set

at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)

at java.io.FilterInputStream.read(FilterInputStream.java:107)

有人知道为什么会抛出这个异常,它是什么意思吗?

附:我应该提到我在 JBoss 7.1.1 上的侦听器上运行它,以便从不同的文件夹压缩各种日志文件。每个文件夹都有一个线程。使用多个线程的事实会导致这个问题吗?

【问题讨论】:

【参考方案1】:

您正在将新 zip 文件的 ZipEntry 设置为您从原始文件中获得的相同实例。这意味着所有值必须匹配,但如果写入条目的压缩大小与源文件的压缩大小不匹配,则会失败。原始压缩代码与您现在使用的压缩代码之间的最细微差别将产生不同的压缩大小。要使其运行,您必须为输出创建ZipEntry 的副本并在其上重置压缩大小。

顺便说一句,您在代码中使用了zin.getNextEntry()zf.getInputStream(ze),这意味着您同时使用了ZipFileZipInputStream。如果它们引用同一个文件,那就是浪费资源,如果它们引用不同的文件,你可能会遇到更多的问题。

选择ZipFile

ZipFile zf = …
ZipOutputStream zos = …
byte[] buffer = …

for(Enumeration<? extends ZipEntry> e=zf.entries(); e.hasMoreElements();) 
  ZipEntry ze = e.nextElement();
  InputStream is = zf.getInputStream(ze);
  ZipEntry zeOut=new ZipEntry(ze);
  zeOut.setCompressedSize(-1);
  zos.putNextEntry(zeOut);
  int len;
  while ((len = is.read(buffer)) >= 0) 
     zos.write(buffer, 0, len);
  
  zos.closeEntry();

zos.close();
zf.close();

ZipInputStream

ZipInputStream zin…
ZipOutputStream zos=…
byte[] buffer = …

ZipEntry ze = zin.getNextEntry();
while (ze != null) 
  ZipEntry zeOut=new ZipEntry(ze);
  zeOut.setCompressedSize(-1);
  zos.putNextEntry(zeOut);
  int len;
  while ((len = zin.read(buffer)) >= 0) 
     zos.write(buffer, 0, len);
  
  zos.closeEntry();
  ze = zin.getNextEntry();

zos.close();
zin.close();

【讨论】:

感谢老兄,这简直太棒了!我认为没有必要“重置”压缩大小,因为我只是将文件复制到新的 zip 文件中,以便能够将新文件添加到 zip 中。附:如果您想知道我选择了 ZipInputStream 方式。

以上是关于java:Zip Exception无效代码长度?的主要内容,如果未能解决你的问题,请参考以下文章

Exception in thread “main“ java.util.zip.ZipException: zip END header not found

Exception in thread “main“ java.util.zip.ZipException: zip END header not found

启动tomcat时报错了, nested exception is java.sql.SQLException: 调用中无效的参数

Unhandled event loop exception GC overhead limit exceeded

React-native Exception in thread "main" java.lang.RuntimeException: gradle-2.14.1-all.zip(

React-native Exception in thread "main" java.lang.RuntimeException: gradle-2.14.1-all.zip(