I have a class which wraps ZipEntrys, but I'm struggling to see how I could then write a method that returns an input stream from any one ZipEntry. I managed to write something that could return an array of input streams for a ZipFile, but I need a way to get an input stream from just one ZipEntry.
3 Answers
How about this?
ZipFile zipFile = new ZipFile("file.zip");
ZipEntry zipEntry = zipFile.getEntry("fileName.txt");
InputStream inputStream = zipFile.getInputStream(zipEntry);

- 13,313
- 16
- 79
- 92

- 6,425
- 3
- 38
- 63
-
1Unfortunately creating a new instance of ZipFile leaks file handles in 1.4.2_12 – Nick Bolton Sep 20 '10 at 10:37
Do you not have the ZipFile instance from which the ZipEntry was sourced? If you do you could use ZipFile.getInputStream(ZipEntry).
https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipFile.html
PS. Just had a quick look at the code and a ZipEntry is not a wrapper for the underlying data in the zip file. It is just a "place holder" for the entry as far as I can see (i.e. zipped file attributes not the data). The actual stream is created through a JNI call in the ZipFile class. Meaning that I do not believe you can do what you are looking to do in a practical way.

- 41,764
- 65
- 238
- 329

- 571
- 4
- 6
-
Malcolm, Thanks for the help, I just found that method. My problem now is that the code that originally 'opens' the zip file (when you do ZipFile zip = new ZipFile("path");), then closes it. I can stop it closing it if I want, but I was wondering - what are the consequences of not closing zips/jars? Obviously if I do remove the close() command I will leave a method so the user can close it later, but I was wondering what would happen if the user forgot - just greedy on memory? I know it isn't a wrapper for the data - what I'm writing is a wrapper for dealing with Zip/Jar files. – Stephen Nov 12 '09 at 16:28
-
1Leaving it open doesn't feel like a good idea to me. Equally so for deferring responsibility for closing to the user of your solution. An option (possibly - I am guessing at the problem you are solving) is to wrap the ZipEntry and include with it a handle to the ZipFile in the wrapping class. This seems a little heavy but does mean that you can open\close a stream to the wrapped zip entry whenever you need. – Malcolm Featonby Nov 13 '09 at 05:49
-
2What if I don't have it as a File, but I can always re-create the ZipInputStream (from a Uri, for example) ? Is it possible to have a way for each of the ZipInputStream's entries to create an InputStream, easily? – android developer Feb 29 '20 at 22:28
static void printInputStream(File zip) throws IOException
{
ZipInputStream zin = new ZipInputStream(new FileInputStream(zip));
for (ZipEntry zipEntry;(zipEntry = zin.getNextEntry()) != null; )
{
System.out.println("reading zipEntry " + zipEntry.getName());
Scanner sc = new Scanner(zin);
while (sc.hasNextLine())
{
System.out.println(sc.nextLine());
}
System.out.println("reading " + zipEntry.getName() + " completed");
}
zin.close();
}
It was found here:
getInputStream for a ZipEntry from ZipInputStream (without using the ZipFile class)
Misunderstanding in what is the input stream that is opened from zip file.
Solution: open input stream from zip file
ZipInputStream zipInputStream = ZipInputStream(new FileInputStream(zipfile)
,
run cycle zipInputStream.getNextEntry()
.
For every round you have the inputstream for current entry (opened for zip file before);
..

- 1
- 1

- 171
- 1
- 3
-
2This method is more generic than `ZipFile.getInputStream()` method since it doesn't require input coming from an actual file. So, it can be used to read an in-memory zip file content. – mmdemirbas May 17 '18 at 09:09
-
2