2009-11-12 7 views
26

Ich habe eine Klasse, die ZipEntrys umschließt, aber ich habe Mühe zu sehen, wie ich dann eine Methode schreiben könnte, die einen Eingabestream von einem ZipEntry zurückgibt. Ich habe es geschafft, etwas zu schreiben, das ein Array von Eingabestreams für eine Zip-Datei zurückgeben könnte, aber ich brauche einen Weg, um einen Eingabestream von nur einem ZipEntry zu erhalten.Wie erstelle ich einen Eingabestream von einem ZipEntry

+3

Blick auf: http://stackoverflow.com/questions/3233555/is-it-possible-to-get-a-zipentrys-inputstream-from-a-zipinputstream – diyism

Antwort

20

Haben Sie nicht die ZipFile-Instanz, von der der ZipEntry bezogen wurde? Wenn Sie das tun, können Sie ZipFile.getInputStream (ZipEntry) verwenden.

https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipFile.html

PS. Ich habe mir nur kurz den Code angeschaut und ein ZipEntry ist kein Wrapper für die zugrunde liegenden Daten in der Zip-Datei. Es ist nur ein "Platzhalter" für den Eintrag soweit ich sehen kann (d. H. Gezippte Dateiattribute, nicht die Daten). Der tatsächliche Stream wird durch einen JNI-Aufruf in der ZipFile-Klasse erstellt. Das bedeutet, dass ich nicht glaube, dass Sie tun können, was Sie auf praktische Weise tun wollen.

+0

Malcolm, Danke für die Hilfe, Ich habe gerade diese Methode gefunden. Mein Problem ist jetzt, dass der Code, der ursprünglich die Zip-Datei öffnet (wenn Sie ZipFile zip = new ZipFile ("path");), dann schließt es. Ich kann es stoppen, wenn ich will, aber ich frage mich - was sind die Konsequenzen, wenn man keine Reißverschlüsse schließt? Offensichtlich, wenn ich den close() Befehl lösche, hinterlasse ich eine Methode, damit der Benutzer sie später schließen kann, aber ich habe mich gefragt, was passieren würde, wenn der Benutzer vergessen würde - nur gierig auf Speicher? Ich weiß, es ist kein Wrapper für die Daten - was ich schreibe ist ein Wrapper für den Umgang mit Zip/Jar-Dateien. – Stephen

+1

Es offen zu lassen fühlt sich nicht wie eine gute Idee für mich an. Ebenso, um die Verantwortung für das Schließen an den Benutzer Ihrer Lösung zu verschieben. Eine Option (möglicherweise - ich rate zu dem Problem, das Sie lösen) ist, den ZipEntry zu umbrechen und ein Handle auf die Zip-Datei in der Wrapping-Klasse einzufügen. Dies scheint ein wenig schwer, aber bedeutet, dass Sie öffnen können, schließen Sie einen Stream zu den umschlossenen Zip-Eintrag, wann immer Sie brauchen. –

27

Wie wäre es damit?

ZipFile zipFile = new ZipFile("file.zip"); 
ZipEntry zipEntry = zipFile.getEntry("fileName.txt");  
InputStream inputStream = zipFile.getInputStream(zipEntry); 
+0

+1 für das Code-Snippet. –

+1

Leider erstellt das Erstellen einer neuen Instanz von ZipFile Dateihandles in 1.4.2_12 –

4
static void printInputStream(File zip) throws IOException 
    { 
     ZipInputStream zin = new ZipInputStream(new FileInputStream(zip)); 
     for (ZipEntry zipEntry;(zipEntry = zin.getNextEntry()) != null;) 
     { 
      System.out.println("reading zipEntry " + zipEntry.getName()); 
      Scanner sc = new Scanner(zin); 
      while (sc.hasNextLine()) 
      { 
       System.out.println(sc.nextLine()); 
      } 
      System.out.println("reading " + zipEntry.getName() + " completed"); 
     } 
     zin.close(); 
    } 

Es wurde hier gefunden:
getInputStream for a ZipEntry from ZipInputStream (without using the ZipFile class)

Misunderstanding in dem, was ist der Eingangsstrom, der von Zip-Datei geöffnet wird. Lösung: Öffnen Sie den Eingangsstrom aus der Zip-Datei ZipInputStream zipInputStream = ZipInputStream(new FileInputStream(zipfile), Laufzyklus zipInputStream.getNextEntry(). Für jede Runde haben Sie den Eingangsstrom für den aktuellen Eintrag (zuvor für Zip-Datei geöffnet); ..

Verwandte Themen