getInputStream for a ZipEntry from ZipInputStream (without using the ZipFile class)
Asked Answered
Q

3

36

How can I get an InputStream for a ZipEntry from a ZipInputStream without using the ZipFile class?

Quintanilla answered 30/1, 2013 at 11:50 Comment(1)
What about such answer, isnt it better? ZipFile zipFile = new ZipFile(filePath); ZipEntry entry = zipFile.getEntry(entryName); InputStream inputStream = zipFile.getInputStream(entry);Quip
G
22

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();
}
Gneiss answered 30/1, 2013 at 12:6 Comment(3)
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
R
21

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.

Rammish answered 30/1, 2013 at 11:58 Comment(0)
P
3

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());
}
Placencia answered 16/3, 2017 at 13:11 Comment(1)
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.