我对aperkins解决方案持怀疑态度(已删除),但我知道它为什么有效。该行(此后已在他的回答中更正)
zipOut.setLevel(ZipOutputStream.STORED); // accidentally right
正在使用静态值ZipOutputStream.STORED
,巧合地等于0
。因此,该行所做的是将默认 DEFLATED 方法使用的级别设置为零压缩(这显然是您想要做的,但碰巧只能靠运气工作)。因此,要明确安全地获得您想要的东西,请改用它:
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 方法,您必须先读取整个入口文件,或者在调用之前找到其他方法来设置大小、压缩大小(必须相等)和 CRCzipOut.putNextEntry()
. 否则,如果您通过向输出流写入过多字节来超出 size 属性,您将遇到更多异常。似乎 ZIP 规范说,如果您正在编写 STORED 数据,那么它必须在数据本身之前“预先”写入标头 [包括 CRC-32 和长度],因此 java API 需要在它之前设置这些可以启动,因为它基本上只支持流式传输到最终的 zip 文件。