java - 如何在 Java 中创建未压缩的 Zip 存档

标签 java zip crc32

我正在使用 Java 的 Zip 实用程序包,想知道如何创建一个完全不压缩的 zip 文件。将级别设置为 0 无济于事。是这样吗?

另外,当我使用 STORED 方法时,它会抛出以下异常:

java.util.zip.ZipException: STORED entry missing size, compressed size, or crc-32

我可以设置大小,但现在抛出以下异常:

java.util.zip.ZipException: invalid entry crc-32 

我只是在网上搜索所有可用的示例,我猜我无法真正正确理解它。如果有人能在这方面帮助我并提供建议来纠正我可能正在做的问题,那就太好了。

最佳答案

我对 aperkins 解决方案持怀疑态度(已删除),但我知道它为什么有效。该行(此后已在他的回答中更正)

zipOut.setLevel(ZipOutputStream.STORED); // accidentally right

使用的是静态值 ZipOutputStream.STORED,恰好等于 0。因此,该行所做的是将默认 DEFLATED 方法使用的 level 设置为零压缩(这显然是您想要做的,但碰巧只能靠运气工作)。因此,要明确安全地获得您想要的东西,请改用它:

zipOut.setMethod(ZipOutputStream.DEFLATED); // this line optional
zipOut.setLevel(0);

zipOut.setLevel(Deflater.NO_COMPRESSION);

如果你使用

zipOut.setMethod(ZipOutputStream.STORED);
zipOut.setLevel(Deflater.NO_COMPRESSION);

您可能会得到 Keya 在原始问题中指出的异常。我相信 Christian Schlichtherle 是对的;您收到异常是因为您没有在条目中设置 CRC。这样做的后果是,要使用 STORED 方法,您必须先读取整个入口文件,或者在调用 zipOut 之前找到其他方法来设置大小、压缩大小(必须相等)和 CRC。 putNextEntry().否则,如果您通过向输出流写入过多字节来超出 size 属性,您将遇到更多异常。似乎 ZIP 规范说,如果您正在编写 STORED 数据,那么它必须在数据本身之前“预先”写入 header [包括 CRC-32 和长度],因此 java API 需要在它之前设置这些可以启动,因为它基本上只支持流到最终的zip文件。

关于java - 如何在 Java 中创建未压缩的 Zip 存档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1206970/

相关文章:

java - 如何使用java CRC32类

java - 一个简单的 "Hello World"在 64 位机器上需要 10G 虚拟内存,而在 32 位机器上需要 1G?

java - 在测试期间清除嵌入式 activemq 数据

java - 使用 JPA 引用 "to any"

php - 下载由PHP中的多个文件组成的Zip文件

python - Zlib Ruby 和 Python 库中的 CRC32 校验和不同

java - MacRoman 与 UTF-8

java - 如何在 Java 中压缩目录的内容

haskell - 使用 Haskell 的 zip-conduit 从 zip 存档中的文件中读取行