Comment obtenir une InputStream
pour une ZipEntry
à partir d'une ZipInputStream
sans utiliser la classe ZipFile
?
ç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();
}
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.
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());
}