2013-02-08 9 views
5

Ich habe eine Datei mit Namen wie ex.zip. In diesem Beispiel enthält die Zip-Datei nur eine Datei mit demselben Namen (z. B. "ex.txt"), die ziemlich groß ist. Ich möchte die Zip-Datei nicht jedes Mal extrahieren. Daher muss ich den Inhalt der Datei (ex.txt) lesen, ohne die Zip-Datei zu extrahieren. Ich habe versucht, einen Code wie unten, aber ich kann nur den Namen der Datei in der Variablen lesen.So lesen Sie den Inhalt der ZIP-Datei ohne Extrahieren in Java

Wie lese ich den Inhalt der Datei und speichert es in der Variablen?

Vielen Dank im Voraus

fis=new FileInputStream("C:/Documents and Settings/satheesh/Desktop/ex.zip"); 
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
ZipEntry entry; 

while((entry = zis.getNextEntry()) != null) { 
    i=i+1; 
    System.out.println(entry); 
    System.out.println(i); 
    //read from zis until available 
} 
+1

Wie geschrieben, Ihre Frage ist sehr unklar ist. Möchten Sie Dateien aus der PLZ extrahieren oder nicht? Was * spezifisches Problem * versuchst du zu lösen? – parsifal

+0

tschüss übrigens: Navigationssysteme machen es genauso, sie behalten ihre digitalen Straßenkarten im Hauptspeicher komprimiert und entpacken Teile nach Bedarf – AlexWien

Antwort

5

Ihre Idee ist die Zip-Datei zu lesen, wie es in ein Byte-Array ist und speichern sie in einer Variablen. Später, wenn Sie die Zip benötigen extrahieren Sie es auf Anfrage, Daten speichern:

Zuerst den Inhalt der Zip-Datei in einem Byte-Array zipFileBytes

lesen Wenn Sie Java 1.7:

Path path = Paths.get("path/to/file"); 
byte[] zipFileBytes= Files.readAllBytes(path); 

sonst verwenden Appache.commons lib

byte[] zipFileBytes; 
zipFileBytes = IOUtils.toByteArray(InputStream input); 

Jetzt ist Ihre Postleitzahl Datei wird in einer variablen zipFileBytes, noch in komprimierter Form gespeichert.

Dann, wenn Sie etwas verwenden

ByteArrayInputStream bis = new ByteArrayInputStream(zipFileBytes)); 
ZipInputStream zis = new ZipInputStream(bis); 
4

diese müssen extrahieren Versuchen:

 ZipFile fis = new ZipFile("ex.zip"); 

     int i = 0; 
     for (Enumeration e = zip.entries(); e.hasMoreElements();) { 
      ZipEntry entry = (ZipEntry) e.nextElement(); 
      System.out.println(entry); 
      System.out.println(i); 

      InputStream in = fis.getInputStream(entry); 

     } 

Zum Beispiel, wenn die Datei Text enthält, und Sie wollen es als Zeichenfolge drucken, können Sie lese den InputStream so: Read/convert an InputStream to a String

2

Ich denke, dass in deinem Fall die Tatsache, dass eine Zip-Datei ein Container ist, der viele Dateien enthalten kann (und zwingt dich so zu navigieren Wenn Sie die Datei öffnen, wird die Datei jedes Mal nach rechts verschoben, wenn Sie angeben, dass jede ZIP-Datei nur eine Textdatei enthält. Vielleicht ist es viel einfacher, die Textdatei einfach zu entpacken (gzip ist kein Container, sondern nur eine komprimierte Version Ihrer Daten). Und es ist sehr einfach zu bedienen:

GZIPInputStream gis = new GZIPInputStream(new FileInputStream("file.txt.gz")); 
// and a BufferedReader on top to comfortably read the file 
BufferedReader in = new BufferedReader(new InputStreamReader(gis)); 

sie zu produzieren, ist ebenso einfach:

GZIPOutputStream gos = new GZIPOutputStream(new FileOutputStream("file.txt.gz")); 
+0

Das ist nicht die Antwort, er will den Zip in komprimierter Form in einer Variablen. Quote: Ich möchte nicht jedes Mal die Zip-Datei auf Platte extrahieren und dann ihre Daten lesen – AlexWien

+0

@AlexWien Es geht nicht, es erlaubt nur den Inhalt zu lesen (Byte für Byte oder wie Zeile für Zeile) ** ohne die ganze Datei auf einmal zu erweitern, und es war mein Verständnis, dass OP dahinter steht. Ich wollte lediglich auf eine Alternative zum Zippen von Dateien hinweisen, mit der man einfacher arbeiten kann als mit einer Zip-Datei. Das Speichern einer Zip-Datei als solche in einer Variablen-Imo hat keine praktische Anwendung. – fvu

+0

Es ist unklar, was er wollte, vielleicht wollte er, was Ihre Lösung ist, entpacken ohne eine neue Datei auf der Festplatte zu erstellen. Es ist nicht immer blöd, eine Zip-Datei in einem Avariable zu behalten: Es ist schneller, aus einem Byte-Array zu entzippen als aus einer Datei zu lesen: Stellen Sie sich vor, Sie müssen 100 Mal die Sekunde entpacken, das geht nicht mit Disk-Zugriffen auf einem eingebetteten Gerät mit niedriger Cache Es gibt viele Anwendungen: z. B. Kartenabgleichsysteme, die die Spur berechnen, die ein Fahrzeug in zwei großen Ländern fuhr: Das Lesen von der Platte würde zu langsam sein – AlexWien

Verwandte Themen