繁体   English   中英

在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格式的size字段保留的四个字节表示的数字。

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

显然,无效文件是由于这种方式偶然起作用的,提取过程得以实现。 通过处理压缩后的字节, 然后使用头中存储的未压缩大小来验证所得的字节数,从而工作。 当提取的字节数存储在32位int变量中并且在提取过程中无提示地溢出并且仅在最后进行验证时,它看起来与存储的32位大小相同。

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

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

在Java 7中添加了ZIP64支持

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM