有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

ZipFile中的java ZipFile

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

现在,我有一个以zipInputStream和zipFile为参数的函数。问题是;如果我在另一个zip中得到一个zip,我将再次递归调用这个函数。所以我不知道如何在另一个zipFile中为zipFile创建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文件,我需要创建一个文档对象。因此,如果我在DocumentBuilder中为parse()方法传递正常的zipInputStream,它将关闭流,并且我无法再次使用它。所以我用了(ZipFile object).getInputStream(currentEntryForXML)内部DocumentBuilder parse().


共 (1) 个答案

  1. # 1 楼答案

    无法在存档中为zip文件创建ZipFile。但是为什么你的方法中需要这个论点呢?如果你只需要一个流,就用你的参数zInpStream作为contstructor参数,比如

    checkZIP(new ZipInputStream(zInpStream));
    

    打电话给zInpStream之后。GetNextery()zInpStream已经位于该条目的开头,在调用GetNextery()之前,它将只读取该条目

    编辑。看到你的编辑了。似乎,如果你阻止关闭流,这对你来说就足够了。只需使用稍加修改的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)));