此页面列出了 Apache Commons Compress™ 的已知限制和问题,按它们适用的归档/压缩格式分组。

General

  • 解压缩器和解归档器的几个实现将在底层 InputStream 上调用 skip,这可能会在某些流实现中抛出 IOException。 发生这种情况的一种已知情况是使用 System.in 作为输入。 如果您遇到带有“非法搜索”之类的消息的异常,我们建议您在将流传递给 Compress 之前将流包装在我们的 utils 包中的 SkipShieldingInputStream 中
  • 1.21 之前的 Commons Compress 不能在 JDK 14 或更高版本上构建

7Z

  • 该格式需要其他可选的 XZ for Java 库。
  • 仅支持文件作为输入/输出,而不支持流。从 Compress 1.13 SeekableByteChannel 开始也受支持。
  • 在 Compress 1.7 中,ArchiveStreamFactory 不会自动检测 7z 档案,从 1.8 开始,它会在读取 7z 档案时抛出 StreamingNotSupportedException。
  • 仅在读取档案时支持加密、固态压缩和标头压缩
  • Commons Compress 1.12 及更早版本不支持编写 LZMA。
  • 7z 支持的几个“方法”在 Compress 中没有实现。
  • 不支持编写多卷档案。可以通过简单地连接部分来读取此类存档,例如使用 MultiReadOnlySeekableByteChannel。
  • Compress 1.8 添加了对一些 BCJ 过滤器和 DELTA 过滤器的支持。由于 XZ for Java 库 1.4 版中的一个已知错误,使用 BCJ 过滤器的存档在读取时会导致 AssertionError。如果您需要支持 BCJ 过滤器,您必须使用 XZ for Java 1.5 或更高版本。

AR

  • AR 档案不能包含目录 - 这是格式的限制,而不是 Compress 的实现之一。
  • 仅使用 BSD 方言完全支持长度超过 16 个字符的文件名,仅在读取档案时支持 GNU/SRV4 方言。

ARJ

  • 只读支持
  • 不支持压缩、加密或多卷存档

    Brotli

  • 该格式需要其他可选的 Google Brotli dec 库。

  • 只读支持
  • CompressorStreamFactory 无法使用 Brotli 压缩自动检测流。

BZIP2

1.4.1 之前的 Compress 版本容易受到可能的拒绝服务攻击,请参阅安全报告页面了解详细信息。

CPIO

目前没有发现任何问题。

DEFLATE

  • CompressorStreamFactory 无法使用 DEFLATE 压缩自动检测流。

    DEFLATE64

  • CompressorStreamFactory 无法使用 DEFLATE64 压缩自动检测流。

  • 只读支持

DUMP

  • 只读支持
  • 仅支持 new-fs 格式
  • 唯一支持的压缩算法是 zlib

GZIP

目前没有发现任何问题。

JAR

JAR 档案是特殊的 ZIP 档案,ZIP 的所有限制也适用于 JAR。

  • ArchiveStreamFactory 无法从 ZIP 档案中区分 JAR 档案,也不会自动检测 JAR。
  • Compress 不提供对存档清单的特殊访问

    LZ4

  • 理论上 LZ4 压缩流可以包含任意长度的文字和副本,而 Commons Compress 仅支持最大 263 - 1 的大小(即 ≈ 9.2 EB)。

    LZMA

  • 该格式需要其他可选的 XZ for Java 库。

  • Commons Compress 1.12 及更早版本仅支持读取格式

    PACK200

  • Commons Comppress 1.21 之前的 Pack200 支持依赖于 Java 类库的 Pack200 类。 Java 14 删除了支持,因此 Pack200 在 Java 14 或更高版本上运行时根本无法工作。

  • 从 Commons Compress 1.21 开始,不再使用 classlib 实现,取而代之的是 Commons Compress 包含已退役的 Apache Harmony™ 项目的 pack200 代码。

SNAPPY

  • Commons Compress 1.13 及更早版本仅支持读取格式

    TAR

  • 在 Compress 1.20 之前的版本中无法读取稀疏文件

  • 稀疏文件(sparse files)无法写入
  • 仅支持 GNU 和 POSIX 扩展的一个子集
  • 在 Compress 1.6 中,TarArchiveInputStream 可能无法读取条目的全部内容,除非流被包装在缓冲流中。

    XZ

  • 该格式需要其他可选的 XZ for Java 库。

    Z

  • 在 Compress 1.8.1 之前,CompressorStreamFactory 无法使用 .Z 压缩自动检测流。

  • 只读支持

    ZIP

  • ZipArchiveInputStream 是有限的,在某些情况下甚至可能返回错误的内容,尽可能使用 ZipFile。有关详细信息,请参阅 ZIP 文档页面。此限制是流数据与使用随机访问的结果,而不是 Compress 特定实现的限制。

  • 仅支持一部分压缩方法,包括最常见的 STORED 和 DEFLATEd。 IMPLODE、SHRINK、DEFLATE64 和 BZIP2 支持是只读的。
  • 不支持加密
  • Compress 1.20 之前不支持多卷存档
  • 目前无法写入超过 64k 段的拆分存档。创建包含超过 100 个段的拆分存档时,您需要调整文件名,因为 ZipArchiveOutputStream 假定扩展名将是三个字符长。
  • 在 Compress 1.6 之前的版本中,当使用 Java 8 或更高版本时,从存档读取的 ZipArchiveEntries 将包含非零毫秒值,而不是预期的两秒粒度。
  • Compress 1.7 有一个已知错误,如果使用 STORED 方法,ZipArchiveInputStream 将无法正确读取档案的第一个条目。
  • ZipArchiveEntry#getLastModifiedDate 在幕后使用 ZipEntry#getTime,当使用不同版本的 Java 时,可能会为同一存档返回不同的时间。
  • 在 1.16 之前的 Compress 版本中,特制的 ZIP 存档可用于在 ZipFile 和 ZipArchiveInputStream 类使用的 Compress 的额外字段解析器内造成无限循环。这可用于对使用 Compress 压缩包的服务发起拒绝服务攻击。有关详细信息,请参阅安全报告页面。

    ZStandard

  • 该格式需要其他可选的 Zstandard JNI 库。