gpt4 book ai didi

java - 将 Zip 转换为存储压缩

转载 作者:太空狗 更新时间:2023-10-29 14:17:16 25 4
gpt4 key购买 nike

我有一个压缩的 zip 文件 file.zip。有没有办法更改要存储的文件的压缩级别(无压缩)。

我已经编写并尝试了以下代码并且它有效,但我将在内存和存储空间有限并且可能没有足够空间的环境中运行它。我正在使用 zip4j 库。

此代码将输入的 zip 解压缩到一个文件夹,然后使用存储压缩级别重新压缩它。这样做的问题是,在执行的某个时刻,存储中有 3 个 zip 副本,这是一个问题,因为空间是有限的。

try {
String zip = "input.zip";
final ZipFile zipFile = new ZipFile(zip);
zipFile.extractAll("dir");
File file = new File("dir");
ZipParameters params = new ZipParameters();
params.setCompressionMethod(Zip4jConstants.COMP_STORE);
params.setIncludeRootFolder(false);

ZipFile output = new ZipFile(new File("out.zip"));

output.addFolder(file, params);
file.delete();
return "Done";
} catch (Exception e) {
e.printStackTrace();
return "Error";
}

那么对于解决这个问题的另一种方法有什么建议吗?或者对我当前的代码进行一些速度或内存优化?

最佳答案

作为替代方案,我们可以在内存中一个一个地读取 zip 中的文件或读取到临时文件中,就像这里一样

    ZipInputStream is = ...
ZipOutputStream os = ...
os.setMethod(ZipOutputStream.STORED);
int bSize = ... calculate max available size
byte[] buf = new byte[bSize];
for (ZipEntry e; (e = is.getNextEntry()) != null;) {
ZipEntry e2 = new ZipEntry(e.getName());
e2.setMethod(ZipEntry.STORED);
int n = is.read(buf);
if (is.read() == -1) {
// in memory
e2.setSize(n);
e2.setCompressedSize(n);
CRC32 crc = new CRC32();
crc.update(buf, 0, n);
e2.setCrc(crc.getValue());
os.putNextEntry(e2);
os.write(buf, 0, n);
is.closeEntry();
os.closeEntry();
} else {
// use tmp file
}
}

读取内存应该会更快

关于java - 将 Zip 转换为存储压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20810786/

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