2012-06-19 9 views
5

Gibt es überhaupt eine Größe von ZipInputStream, bevor wir den Stream vollständig gelesen haben?Die Größe von ZipInputStream erhalten

Zum Beispiel können wir die Metadaten des Eintrags mit getNextEntry abrufen, bevor wir die Benutzerdaten lesen können.

Inputstream hat eine Methode zur Verfügung(), um eine Schätzung der Anzahl der Bytes, die aus diesem Eingabestream gelesen werden können, aber ich bin nicht in der Lage, eine ähnliche Methode für ZipInputStream zu finden.

+0

Haben Sie Zugriff auf die ZipFile, woher der Stream kam? – Thilo

+0

Nein. Wir haben gerade einen Stream. Ich wollte wissen, ob es eine Möglichkeit gibt, die Metadaten zu erhalten, bevor der komplette Stream gelesen wird. –

Antwort

1

ZipInputStream hat Methode zur Verfügung(), aber es gibt 0 oder 1.

Um die geschätzte Größe von jeder Art von Datei zu erhalten, können Sie Fileinputstream verwenden und dann Zip-Datei Verwendung ZipInputStream zu lesen. Bsp.

public class ZipUtil { 

    public static void main(String[] args) throws Exception { 
     ZipInputStream zis = null; 

     FileInputStream fis = new FileInputStream("C:/catalina.zip"); 
     int size = fis.available(); 
     System.out.println("size in KB : " + size/1024); 
     zis = new ZipInputStream(fis);   

     ZipEntry ze; 
     while ((ze = zis.getNextEntry()) != null) { 
      System.out.println(ze.getName()); 
     } 
    } 
} 
+0

Das Problem mit diesem Ansatz ist, dass ich keine Zip-Datei habe, die ich in einen FileInputStream machen kann. Ich habe nur einen ZipInputStream, mit dem ich arbeiten kann. –

+0

Bitte teilen Sie Ihren Code, um Ihre Anforderung besser zu verstehen –

+1

Es gibt eine spezielle Warnung im Javadoc gegen die Verwendung von available() als Gesamtgröße. – EJP

2

Wenn Sie nur den Stream haben, dann denke ich nicht.

Die zip file format hat nur eine Sequenz von Einträgen, und dann ein globales Verzeichnis (das eine Tabelle aller Dateien und ihrer Größen hat) am Ende. Ohne Zugriff auf die Datei gelangen Sie nicht zu diesen Informationen.

1

INPUTSTREAM- hat ein Verfahren zur Verfügung() eine Schätzung der Anzahl der Bytes zurück, die von diesem Eingangsstrom gelesen werden kann

ohne zu blockieren. Nicht das Gleiche. Es gibt eine spezielle Warnung im Javadoc über nicht, die diesen Wert als eine Gesamtdateigröße behandelt.

aber ich bin nicht in der Lage, eine ähnliche Methode für ZipInputStream zu finden.

Das ist seltsam, weil es da ist. Es gibt jedoch null zurück, was die beste Schätzung ist, wie viel gelesen werden kann ohne zu blockieren.

Warum? Weil (a) es ein Stream ist und (ii) es ein gezippter Stream ist. Es gibt keine Möglichkeit zu wissen, wie viel es gibt, ohne alles zu lesen; und es gibt keine Möglichkeit zu wissen, wieviel davon ohne Blockierung gelesen werden kann,