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) 5650884111L
而 5650884111
是一个数字,无法使用为 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 文件应该可以解决问题。
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 格式的大小字段保留的四个字节来表示。
既然你说了,它在 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 文件应该可以解决问题。