此页面列出了 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
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。
-
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
-
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 库。