在zipentry java中查找文件

时间:2012-06-20 16:01:06

标签: java zipinputstream

我正在尝试在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;
}

现在我面临的主要问题是ZipInputStream中的Search_ImageZipInputStream的原始组件相同......

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?如果我在我的方法中做了任何错误,请加入,因为我仍缺乏此课程的逻辑。

3 个答案:

答案 0 :(得分:6)

如果您还不需要输入流,则应该使用类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内的文件名始终包含路径

答案 1 :(得分:4)

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

为了获得最佳效果,您需要使用ZipFile才能直接访问条目,这要归功于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.pngbar目录中,预期名称为bar/foo.png

答案 2 :(得分: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;
}