How can I get an InputStream
for a ZipEntry
from a ZipInputStream
without using the ZipFile
class?
getInputStream for a ZipEntry from ZipInputStream (without using the ZipFile class)
Asked Answered
it works this way
static InputStream getInputStream(File zip, String entry) throws IOException {
ZipInputStream zin = new ZipInputStream(new FileInputStream(zip));
for (ZipEntry e; (e = zin.getNextEntry()) != null;) {
if (e.getName().equals(entry)) {
return zin;
}
}
throw new EOFException("Cannot find " + entry);
}
public static void main(String[] args) throws Exception {
InputStream in = getInputStream(new File("f:/1.zip"), "launch4j/LICENSE.txt");
Scanner sc = new Scanner(in);
while(sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
in.close();
}
thanks, but i mean instantiating a new InputStream objects that can be used later or when ever needed, not one by one- entry after entry. –
Quintanilla
How would it work starting with
ZipInputStream zipInputStream = new ZipInputStream(jar.openStream());
? –
Listed What is it?! It always return ZipInputStream zin; object - It's one object for zip archive. And it's the same for all entries :-| –
Covert
Err, the ZipInputStream
already is an InputStream.
You don't need another one. Getting the next ZipEntry
positions the stream at the beginning of the entry. See the Javadoc.
To return a List of Input Streams that can be used later I used the following
public static List<InputStream> listResourcesInJar(URL jar) throws IOException{
ZipInputStream zipInputStream = new ZipInputStream(jar.openStream());
ZipEntry zipEntry = null;
List<InputStream> inputStreams = new ArrayList<>();
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
String entryName = zipEntry.getName();
if (entryName.endsWith(".xsd")) {
inputStreams.add(convertToInputStream(zipInputStream));
}
}
return inputStreams;
}
private static InputStream convertToInputStream(final ZipInputStream inputStreamIn) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(inputStreamIn, out);
return new ByteArrayInputStream(out.toByteArray());
}
This loads the entire ZIP file into memory. Not a good idea; not scalable;and not what was asked for. –
Rammish
© 2022 - 2024 — McMap. All rights reserved.
ZipFile zipFile = new ZipFile(filePath);
ZipEntry entry = zipFile.getEntry(entryName);
InputStream inputStream = zipFile.getInputStream(entry);
– Quip