Search code examples
javazipinputstream

Finding a file in zipentry java


I am trying to find a file within a zip file and get it as an InputStream. So this is what I am doing to get it so far and I am not certain if I am doing it correctly.

Here is a sample as the original is slightly longer but this is the main component...

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;
}

Now the main problem I am facing is that The ZipInputStream in Search_Image is the same as the original component of the 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); 
}

Now for the question, how do you get the ZipInputStream as the new zip_entry? Also please add in if I did anything wrong in my method as my logic with this class is still lacking.


Solution

  • You should use the class ZipFile without worrying yourself with an input stream if you don't need it yet.

    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;
    }
    

    Some facts:

    • you should follow conventions for naming methods and variables in your code (Search_Image is not fine, searchImage is)
    • directories in zip files does not contain any file, they are just entries like everything else so you shouldn't try to recurse into them)
    • you should compare the name you provide by using endsWith(name) because the file could be inside a folder and a filename inside a zip always contains the path