ZipFile包含在ZipFile中

3
我有一个zip文件,里面可能包含任意数量的zip文件(也可以递归地包含)。我需要遍历其中所有的zip文件。
目前,我有一个函数,它以zipInputStream和zipFile作为参数。问题是:如果我在另一个zip文件中获得了一个zip文件,我会再次递归地调用这个函数。所以我不知道如何为另一个zip文件中的zip文件创建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对象。所以,如果我将普通的zipInputStream传递给DocumentBuilder中的parse()方法,它会关闭流,我就不能再次使用它。所以我在DocumentBuilder parse()中使用了(ZipFile object).getInputStream(currentEntryForXML)


2
然后扩展FilterInputStream以覆盖close方法为无操作,并使用其中一个包装ZipInputStream - erickson
3
请注意 - 可以(并已经有人这样做了)创建一个递归的zip文件:http://www.steike.com/code/useless/zip-file-quine/ - Chris Lutz
是的,我会小心的.. 非常感谢。 - vpram86
1个回答

4
你不能为存档文件内部的zip文件创建ZipFile。但是你为什么需要在方法中使用这个参数呢?如果你只需要一个流,只需将你的zInpStream参数作为构造函数参数使用,例如:
checkZIP(new ZipInputStream(zInpStream));

调用zInpStream.getNextEntry()后,zInpStream已经定位在该条目的开头,并且仅读取该条目,直到调用getNextEntry()。

编辑。看到您的编辑。如果您防止流关闭,则对您来说就足够了。只需使用略微修改的FilterInputStream,它将close()调用委托给zipInputStream中的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)));

请检查我的编辑。如果我在 zip 中获取一个 XML,我会使用相同的流进行解析,并关闭该流。 - vpram86

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接