java 升级到 1.8 时解压缩文件时出现问题

Issue while unzipping file on java upgrade to 1.8

Java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b26)

我正在使用内核 java.util.zip 类。现在,在使用此代码解压缩客户端文件时:

public static InputStream unzip(String file,InputStream zip)
        throws IOException {
    file = file.toLowerCase();
    ZipInputStream zin = new ZipInputStream(new BufferedInputStream(zip));
    ZipEntry ze;
    while( (ze = zin.getNextEntry()) != null ) {
        if ( ze.getName().toLowerCase().equals(file) )
            return zin;
    }
    throw new RuntimeException(file+" not found in zip");
}

我收到以下错误:

invalid entry size (expected 1355916815 but got 5650884111 bytes) 

但是相同的代码在 JDK 1.6.

中工作正常

我搜索了一整天,但找不到任何与此代码相对应的更改 Java JDK。

请帮我找到合适的原因或链接来支持我的发现。

嗯,1355916815 == (int) 5650884111L5650884111 是一个数字,无法使用为 ZIP 格式的大小字段保留的四个字节来表示。

既然你说了,它在 Java6 中工作,它不支持 ZIP64 格式,我们可以得出结论,你有一个实际上不支持 5650884111 文件的 ZIP 文件字节,但是由一个工具生成的,该工具忽略了该限制并仅存储了实际大小的低 32 位。

显然,无效文件碰巧由于方式而工作,提取过程已实施。它的工作原理是处理 compressed 字节,并使用存储在 header、afterwards 中的未压缩大小验证生成的字节数。当提取的字节数存储在一个 32 位 int 变量中并在提取过程中悄悄溢出并且仅在最后验证时,它似乎与存储的 32 位大小相同。

自 in-between Java 6 和 Java 8 以来,添加了 ZIP64 支持,我想,解码器现在已更改为使用 long 变量,这这是合理的,因为同一个解码器可用于处理旧 ZIP 和 ZIP64 文件。然后,提取的字节数不再溢出,并且注意到存储的大小 1355916815 与实际提取的 5650884111 字节数不匹配。

除非您需要支持 Java6,否则(重新)将文件创建为有效的 ZIP64 文件应该可以解决问题。

(ZIP64 support has been added in Java 7)