【问题标题】:java: Zip Exception invalid codes length?java:Zip Exception无效代码长度?
【发布时间】: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 上的侦听器上运行它,以便从不同的文件夹压缩各种日志文件。每个文件夹都有一个线程。使用多个线程的事实会导致这个问题吗?

【问题讨论】:

    标签: java jboss7.x zipfile


    【解决方案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 方式。
    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 2020-11-08
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多