5

我正在尝试在 zip 文件中查找文件并将其作为InputStream. 所以这就是我到目前为止所做的事情,我不确定我是否做得正确。

这是一个样本,因为原件稍长,但这是主要组成部分......

public InputStream Search_Image(String file_located, ZipInputStream zip) 
    throws IOException {
    for (ZipEntry zip_e = zip.getNextEntry(); zip_e != null ; zip_e = zip.getNextEntry()) {
        if (file_located.equals(zip_e.getName())) {
            return zip;
        }
        if (zip_e.isDirectory()) {
            Search_Image(file_located, zip); 
        }
    }
    return null;
}

现在我面临的主要问题是ZipInputStreamin与...Search_Image的原始组件相同ZipInputStream

if(zip_e.isDirectory()) {
    //"zip" is the same as the original I need a change here to find folders again.
    Search_Image(file_located, zip); 
}

现在的问题是,您如何获得ZipInputStream新的zip_entry?如果我在我的方法中做错了什么,也请补充,因为我对这个类的逻辑仍然缺乏。

4

3 回答 3

9

ZipFile如果您还不需要它,您应该使用该类而不用担心输入流。

ZipFile file = new ZipFile("file.zip");
ZipInputStream zis = searchImage("foo.png", file);

public InputStream searchImage(String name, ZipFile file) {
  for (ZipEntry e : Collections.list(file.entries())) {
    if (e.getName().endsWith(name)) {
      return file.getInputStream(e);
    }
  }
  return null;
}

一些事实:

  • 您应该遵循代码中命名方法和变量的约定(Search_Image不好,searchImage是)
  • zip 文件中的目录不包含任何文件,它们只是与其他所有内容一样的条目,因此您不应尝试递归到它们)
  • 您应该比较您提供的名称,endsWith(name)因为文件可能位于文件夹中,而 zip 中的文件名始终包含路径
于 2012-06-20T16:13:13.677 回答
5

使用 访问 zip 条目ZipInputStream显然不是这样做的方法,因为您需要遍历条目才能找到它,这不是一种可扩展的方法,因为性能将取决于 zip 文件中的条目总数。

为了获得最佳性能,您需要使用 aZipFile直接访问条目,这要归功于该方法,getEntry(name)无论您的存档大小如何。

public InputStream searchImage(String name, ZipFile zipFile) throws IOException {
    // Get the entry by its name
    ZipEntry entry = zipFile.getEntry(name);
    if (entry != null) {
        // The entry could be found
        return zipFile.getInputStream(entry);
    }
    // The entry could not be found
    return null;
}

请注意,此处提供的名称是存档中图像的相对路径,/用作路径分隔符,因此如果您要访问foo.png目录中的图像bar,则预期名称将为bar/foo.png.

于 2016-10-12T18:18:08.113 回答
0

这是我对此的看法:

ZipFile zipFile = new ZipFile(new File("/path/to/zip/file.zip"));
InputStream inputStream = searchWithinZipArchive("findMe.txt", zipFile);

public InputStream searchWithinZipArchive(String name, ZipFile file) throws Exception {
  Enumeration<? extends ZipEntry> entries = file.entries();
  while(entries.hasMoreElements()){
     ZipEntry zipEntry = entries.nextElement();
      if(zipEntry.getName().toLowerCase().endsWith(name)){
             return file.getInputStream(zipEntry);
      }
  }
  return null;
}
于 2017-05-24T04:24:51.190 回答