【问题标题】:ZipFile inside a ZipFileZipFile 中的 ZipFile
【发布时间】:2009-10-01 05:52:04
【问题描述】:

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

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

sn-p 看起来像这样。

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)

【问题讨论】:

  • 然后扩展 FilterInputStream 以将 close 方法覆盖为空操作,并用其中之一包装 ZipInputStream
  • 当心 - 可以(并且已经完成)创建递归压缩文件:steike.com/code/useless/zip-file-quine
  • 是的,我会小心的..非常感谢

标签: java zip


【解决方案1】:

您不能为存档中的 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。它会关闭流。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2014-12-23
  • 2021-07-15
  • 1970-01-01
相关资源
最近更新 更多