【问题标题】:Cannot unzip files created with Windows "Sent to compressed folder" in scala/java无法解压缩在 scala/java 中使用 Windows“发送到压缩文件夹”创建的文件
【发布时间】:2019-12-20 20:36:45
【问题描述】:

我在 Windows 2008 r2 虚拟机上压缩了一堆 IIS 日志文件,方法是在 Windows 资源管理器中选择它们,然后使用发送到 -> 压缩压缩文件夹。

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

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

commons 压缩返回: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://*.com/a/10634536/832783 解压缩其中一个文件,它返回了 invalid compression method 异常。

这些是存档中的前 16 个字节:

【问题讨论】:

  • 7-zip能打开zip文件吗?
  • 是的,7-zip 可以打开文件。
  • 我发布了一个截图,其中包含标题中的字节
  • ZIP 支持多种压缩方法,Windows 中使用的一种可能是 Java 运行时不支持的一种不常见的方法(请参阅en.wikipedia.org/wiki/Zip_(file_format)#Compression_methods)。使用 7-zip 调查您的 zip 文件以确定是否是这种情况。

标签: java unzip zip4j


【解决方案1】:

根据标题信息(来自您帖子的 16 个字节),zip 文件中的此条目是使用 Deflate64 加密的。不要将 Deflate64 与 Deflate 压缩相混淆。 Deflate64 是 PKWare 的商标(PKWare 是 zip 格式的维护者),是 Deflate 压缩算法的增强版本。根据超级用户上的this question 和github 上的this PR,如果文件大小大于2GB,Windows 将使用Deflate64。 zip4j 和 jdk 的 zip 实用程序尚不支持 Deflate64,但 commons-compress 1.16 版已支持 Deflate64。您或许可以尝试使用最新版本的 commons-compress 来解压缩您的 zip 文件。

编辑:或者,如果您可以选择,您可以尝试使用其他工具(7zip、zip4j 等)创建 zip 文件。这样您就不必处理 Deflate64,这使您的 zip 文件与其他工具兼容。

【讨论】:

  • 确实,zip 文件包含多个日志文件,解压后总共有 16GB 左右。每个文件的大小在 100 到 300 mb 之间。档案有大约。 1.2GB。
  • 好吧,老实说,我简直不敢相信 JDK 没有涵盖这一点,而且它开箱即用。从白盒的角度来看,在 java.util.zip 上,我不应该关心它是 Deflate64 还是 Deflate,而只是简单地使用 API。
最近更新 更多