gpt4 book ai didi

java - ZipFile 中的 ZipFile

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:30 28 4
gpt4 key购买 nike

我有一个 zip 文件,里面可以包含任意数量的 zip 文件(也是递归的)。我需要遍历所有这些。

现在,我有一个将 zipInputStream 和 zipFile 作为参数的函数。问题是;如果我在另一个 zip 中得到一个 zip,我将再次递归调用此函数。所以我不知道如何在另一个 zipfile 中为 zipfiles 创建一个 zipFile 对象。有人可以建议一种方法吗?您以前遇到过这种情况吗。

代码段将如下所示。

private void checkZIP(ZipInputStream zInpStream, ZipFile zf) {
try {
ZipEntry zipEntry = zInpStream.getNextEntry();
while (zipEntry != null) {
String entryName = zipEntry.getName();

if(entryName.endsWith(".zip"))
checkZIP(new ZipInputStream(zf.getInputStream(zipEntry)),<NEW ZIPFILE OBJECT FOR THIS ENTRY>);


//other files parsing apart from zip.

zInpStream.closeEntry();
zipEntry = zInpStream.getNextEntry();
}
zInpStream.close();
} catch(Exception ioe) {
//catching specific exceptions here. But did not want to put al
}
}

编辑: 我需要那个 zip 文件对象,因为。如果我遇到一个 XML 文件,我需要创建一个 Document 对象。因此,如果我在 DocumentBuilder 中为 parse() 方法传递普通的 zipInputStream,它会关闭流,我无法再次使用它。所以我在 DocumentBuilder parse().

中使用了 (ZipFile object).getInputStream(currentEntryForXML)

最佳答案

您不能为存档内的 zip 文件创建 ZipFile。但是为什么你的方法中需要这个参数呢?如果你只需要一个流,只需使用你的参数 zInpStream 作为 contstructor 参数,比如

checkZIP(new ZipInputStream(zInpStream));

在调用 zInpStream.getNextEntry() 之后,zInpStream 已经位于该条目的开头,并且在调用 getNextEntry() 之前将只读取该条目。

编辑。看到你的编辑。似乎,如果您阻止流关闭,这对您来说就足够了。只需使用稍微修改过的 FilterInputStream,它将 close() 调用委托(delegate)给 zipInputStream 中的 closeEntry(),而不是关闭。

public class ZipGuard extends java.io.FilterInputStream {
public ZipGuard(ZipInputStream is) {
super(is);
}

@Override
public void close() throws IOException {
((ZipInputStream) in).closeEntry();
}
}

并在 checkZip 中创建这个守卫:

checkZip(new ZipInputStream(new ZipGuard(zInpStream)));

关于java - ZipFile 中的 ZipFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1502111/

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