无法在Scala/Java中解压使用Windows“发送到压缩文件夹”创建的文件

3

我在Windows 2008 R2虚拟机上使用Windows Explorer选择了一些IIS日志文件,然后使用“发送到” -> “压缩 (zipped) 文件夹”压缩了它们。

我用scala编写了不同的程序,使用了java.util.ZipFile、zip4j和apache commons compress库。

zip4j返回:Exception in thread "main" net.lingala.zip4j.exception.ZipException: Unknown compression method

commons compress返回:org.apache.commons.compress.compressors.CompressorException: No Compressor found for the stream signature.

java.util.Zip返回:java.util.zip.ZipException: invalid compression method

这些zip文件有什么特别之处,以至于这些方法都无法解压缩它们?

我如何使用JVM库解压缩它们?

作为示例,我使用了此代码:https://dev59.com/u2gv5IYBdhLWcg3wY_42#10634536来解压缩其中一个文件,但它返回了invalid compression method异常。

这是存档中的前16个字节:enter image description here


1
7-zip能打开zip文件吗? - Thorbjørn Ravn Andersen
1
是的,7-zip可以打开这个文件。 - boggy
我发布了一个屏幕截图,其中包含头部的字节。 - boggy
ZIP支持多种压缩方法,而Windows中使用的可能是一种不受Java运行时支持的不常见的压缩方法(请参阅https://en.wikipedia.org/wiki/Zip_(file_format)#Compression_methods)。请使用7-zip检查您的zip文件,以确定是否存在这种情况。 - Thorbjørn Ravn Andersen
1个回答

4
根据您发布内容的16个字节的头信息,zip文件中的此条目使用Deflate64进行加密。Deflate64不应与Deflate压缩混淆。Deflate64是PKWare的商标(PKWare是zip格式的维护者),是Deflate压缩算法的增强版本。根据superuser上的这个问题和github上的这个PR,如果文件大小大于2GB,则Windows将使用Deflate64。 zip4j和jdk的zip实用程序尚不支持Deflate64,但commons-compress版本1.16支持Deflate64。您可以尝试使用最新版本的commons-compress来解压缩zip文件。
编辑:或者,如果您有其他选项,可以尝试使用其他工具(7zip、zip4j等)创建zip文件。然后您就不必处理Deflate64了,这使得您的zip文件兼容其他工具。

压缩文件确实包含多个日志文件,总共解压后大约有16GB。每个文件大小在100到300MB之间。该存档文件大小约为1.2GB。 - boggy
1
说实话,我简直无法相信JDK没有涵盖这个问题,并且它可以开箱即用。从白盒子的角度来看,在java.util.zip上,我不应该关心它是Deflate64还是Deflate,只需简单地使用API即可。 - admirm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接