gpt4 book ai didi

java - 不使用 ZipFile 随机访问压缩文件(因为 ZipFile 有一个重大错误)

转载 作者:行者123 更新时间:2023-11-30 06:00:30 27 4
gpt4 key购买 nike

我知道,我知道,谁会想在java中压缩或解压缩大文件。完全不合理。暂时不要怀疑,假设我有充分的理由解压缩一个大的 zip 文件。

问题 1:ZipFile有一个bug (bug # 6280693) ,sun 在 java 1.6 (Mustang) 中修复了这个问题。该修复没有帮助,因为我们的软件需要支持 java 1.4。据我了解,这个错误是这样工作的。当运行以下代码时,Java 会分配一 block 足够大的内存来容纳整个文件。

ZipFile zipFile = new ZipFile("/tmp/myFile.zip");

如果/tmp/myFile.zip 是 4gb,java 会分配 4gb。这会导致堆外异常。遗憾的是,+4gb 的堆大小不是可接受的解决方案。 =(

问题 1 的解决方案:使用 ZipInputStream ,将文件作为流处理,从而减少和控制内存占用。

byte[] buf = new byte[1024];
FileInputStream fs = new FileInputStream("/tmp/myFile.zip")
ZipInputStream zipIn = new ZipInputStream(fs);

ZipEntry ze = zipIn.getNextEntry();

while (ze != null){
while ((int cr = zipIn.read(buf, 0, 1024)) > -1)
System.out.write(buf, 0, len);
ze = zipIn.getNextEntry();
}

问题 2:我想随机访问 ZipEntries。也就是说,我只想解压缩一个 ZipEntry,而不必搜索整个流。目前我正在建立一个 zipEntries 列表,称为 zes:

        ZipInputStream zin = new ZipInputStream("/tmp/myFile.zip");

ZipEntry ze = zin.getNextEntry();
List<ZipEntry> zes = new ArrayList<ZipEntry>();

while(ze!=null){
zes.add(ze);
ze = zin.getNextEntry();
}

然后,当我需要解压缩特定的 zipEntry 时,我会迭代所有 zipEntries,直到找到匹配的 zipEntry,然后将其解压缩。

        ZipEntry ze = in.getNextEntry();
while (! ze.getName().equals(queryZe.getName())){
ze = zin.getNextEntry();
}

int cr;

while ((cr = zin.read(buf)) > -1)
System.out.write(buf, 0, cr);

问题:ZipFile 能够随机访问 ZipEntries。

new BufferedInputStream(zipFile.getInputStream(zipEntry));

如何在不使用 ZipFile 的情况下获得同样的能力?

请注意,ZipInputStream 有一些类似的 strange behavior .

可以在这里找到有关 java 和 ZipFiles 的特别好的文档:

http://commons.apache.org/compress/zip.html

按照答案中的建议,将 sun ZipFile 替换为 apache commons ZipFile 的注意事项:

  1. 太阳 ZipFile.entries()始终按照 ZipEntries 在文件中出现的顺序返回 ZipEntries,而 apache commons ZipFile.getEntries()按随机顺序返回条目。这导致了一个有趣的错误,因为某些代码假设条目是“按顺序”的。

最佳答案

对于此任务,您可能需要查看 Apache Commons Compress , Apache Commons VFS ,或TrueZip 。所有这些都应该与 Java 1.4 兼容,并且可能支持您需要的功能。

关于java - 不使用 ZipFile 随机访问压缩文件(因为 ZipFile 有一个重大错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1166533/

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