web-dev-qa-db-fra.com

getInputStream pour un ZipEntry à partir de ZipInputStream (sans utiliser la classe ZipFile)

Comment obtenir une InputStream pour une ZipEntry à partir d'une ZipInputStream sans utiliser la classe ZipFile?

22
Mohammad Hassany

ça marche comme ça

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();
}
18
Evgeniy Dorofeev

Euh, la ZipInputStream est déjà un InputStream. Vous n'avez pas besoin d'un autre. Obtenir la prochaine ZipEntry positionne le flux au début de l'entrée. Voir le Javadoc.

16
user207421

Pour retourner une liste de flux d’entrée utilisables ultérieurement, j’ai utilisé ce qui suit:

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());
}
0
Grant