[英]Getting FileNotFoundException while unzipping a zip file though Java
[英]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) 5650884111L
而5650884111
是无法使用为ZIP格式的size字段保留的四个字节表示的数字。
如您所言,它在不支持ZIP64格式的Java 6中工作,我们可以得出结论,您有一个ZIP文件,该文件实际上不支持5650884111
字节的文件,而是由一个忽略了该限制的工具生成的并仅存储实际大小的低32位。
显然,无效文件是由于这种方式偶然起作用的,提取过程得以实现。 通过处理压缩后的字节, 然后使用头中存储的未压缩大小来验证所得的字节数,从而工作。 当提取的字节数存储在32位int
变量中并且在提取过程中无提示地溢出并且仅在最后进行验证时,它看起来与存储的32位大小相同。
我想自从在Java 6和Java 8之间增加了对ZIP64的支持之后,我想现在解码器已更改为使用long
变量,这很合理,因为同一解码器可用于处理旧的ZIP和ZIP64文件。 然后,提取的字节数不再溢出,并且注意到存储的大小1355916815
与实际提取的5650884111
字节数不匹配。
除非您需要支持Java 6,(重新)将该文件创建为有效的ZIP64文件应该可以解决该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.