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.
Advertisement
Answer
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