gpt4 book ai didi

java - zip4j 生成所有文件大小 = 0 的 zip

转载 作者:行者123 更新时间:2023-12-02 11:26:55 32 4
gpt4 key购买 nike

我在通过 zip4j 生成 ZIP 文件时遇到问题。

我可以使用以下代码生成 ZIP 存档(我省略了一些与问题无关的部分),这基本上取自 zip4j 教程:

File zipFile = new File(zipName);
ZipParameters params = new ZipParameters();
params.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
params.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
byte[] buffer = new byte[8192];
try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile))) {
for (/* loop through list of input data */) {
String outputName = /* method to determine file name */;
try (InputStream in = /* method to get IS */ ) {
params.setFileNameInZip(outputName);
File tmpEntry = new File(outputName);
tmpEntry.createNewFile();
out.putNextEntry(tmpEntry, params);
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
tmpEntry.delete();
out.closeEntry();
in.close();
}
}
}

问题是,虽然所有文件都正确包含在 ZIP 存档中,但它们声明的文件大小为 0。我可以使用“哑”ZIP 阅读器(如内置 TotalCommander 的阅读器)解压缩它们,因为所有数据实际上都在这里,但更“聪明”的程序(如 7zip)会产生 CRC 错误并拒绝将其打开,因为它们已损坏。

我想说我需要以某种方式声明文件大小(我绝对不会在我的代码片段中这样做),但我无法找到(可能是显而易见的)解决方案。我在 google 上搜索到 native java.util.zip.ZipEntry.setSize() 方法,但我在 zip4j 中没有看到类似的内容>...

有人知道正确的方法吗?

最佳答案

所以解决方案非常简单。只需要在 ZipParameters 中添加以下设置即可:

params.setSourceExternalStream(true);

我是怎么发现的?

我深入研究了代码,在 zip4jCipherOutputStream.java 类的 closeEntry() 方法中找到了以下内容:

if (zipParameters.isSourceExternalStream()) {
fileHeader.setUncompressedSize(totalBytesRead);
if (localFileHeader.getUncompressedSize() != totalBytesRead) {
localFileHeader.setUncompressedSize(totalBytesRead);
}
}

这是唯一调用 setUncompressedSize() 方法的地方 - 听起来像是与声明的文件大小有关 - 方法。所以我开始怀疑并尝试在我的代码中设置参数。它完成了这项工作。

吸取的教训是this example使用 zip4j 是不正确的,因为它缺少关键的代码行。

关于java - zip4j 生成所有文件大小 = 0 的 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49552714/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com