我有一个zip文件,其中可以包含任意数量的zip文件(也可以递归地)。我需要对所有这些进行迭代。
现在,我有一个函数,它以zipInputStream和zipFile作为参数。问题是,如果我在另一个zip中得到一个zip,我将再次递归地调用这个函数。因此,我不知道如何为另一个for文件中的for文件创建一个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文件,我需要创建一个文档对象。因此,如果我在zipInputStream中传递普通的parse()
方法,它会关闭流,并且我无法再次使用它。所以我在DocumentBuilder parse().
里面使用了DocumentBuilder parse().
发布于 2009-10-01 06:04:24
您不能为归档中的zip文件创建一个ZipFile。但是为什么在你的方法中需要这个论点呢?如果您只需要一个流,只需使用参数zInpStream作为contstructor参数,如下
checkZIP(new ZipInputStream(zInpStream));
调用zInpStream.getNextEntry()之后,zInpStream已经定位在该条目的开头,并且只读取该条目,直到调用getNextEntry()为止。
编辑。看到你的编辑了。似乎,如果你阻止流关闭,它将足够你。只需使用稍微修改过的FilterInputStream,它将zipInputStream中的close()调用委托给closeEntry(),而不是close。
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)));
https://stackoverflow.com/questions/1502111
复制相似问题