Wenn die myInputStream
Sie arbeiten mit von einer realen Datei auf der Festplatte kommt, dann können Sie einfach java.util.zip.ZipFile
stattdessen verwenden, die von einem RandomAccessFile
und bietet einen direkten Zugang zu den Zip-Einträge mit Namen unterstützt wird. Aber wenn alles, was Sie haben, ist ein InputStream
(zum Beispiel, wenn Sie den Strom sind die Verarbeitung direkt auf den Eingang von einer Netzwerkbuchse oder ähnlich), dann werden Sie Ihre eigene Pufferung zu tun haben.
Sie könnten den Stream in eine temporäre Datei kopieren, dann öffnen Sie diese Datei mit ZipFile
, oder wenn Sie die maximale Größe der Daten im Voraus kennen (zB für eine HTTP-Anfrage, die seine Content-Length
im Voraus deklariert) könnten Sie a BufferedInputStream
, um es im Speicher zu puffern, bis Sie den gewünschten Eintrag gefunden haben.
BufferedInputStream bufIn = new BufferedInputStream(myInputStream);
bufIn.mark(contentLength);
ZipInputStream zipIn = new ZipInputStream(bufIn);
boolean foundSpecial = false;
while ((entry = zin.getNextEntry()) != null) {
if("special.txt".equals(entry.getName())) {
// do whatever you need with the special entry
foundSpecial = true;
break;
}
}
if(foundSpecial) {
// rewind
bufIn.reset();
zipIn = new ZipInputStream(bufIn);
// ....
}
(ich diesen Code selbst nicht getestet haben, können Sie es finden, notwendig so etwas wie die commons-io CloseShieldInputStream
zwischen dem bufIn
und dem ersten zipIn
, verwenden die erste Zip-Stream zu ermöglichen, ohne Schließung zu schließen das zugrunde liegende bufIn
bevor du es zurückgespult hast).
Ich verstehe nicht ... Iterate die Einträge, bis Sie diejenige, die Sie wollen zu bekommen, ist es dann verarbeiten? –
Zuerst iterieren Sie die Datei und speichern Sie sie wie Sie wollen. Dann wiederhole es einfach nochmal. – Bubletan
Es gibt auch ZipFile (java <7) und das Zip-Dateisystem ab Java7 (obwohl das nicht möglich ist von einem ZipInputStream :)), deshalb ist dies keine Antwort auf die Frage – GPI