ZipFIle ByteArray

zerix

Hausmeister
Moderator
Hallo!

Gibt es eine Möglichkeit eine Zip-Datei nicht aus der Datei zu lesen, sondern aus einem ByteArray. Also ich hab die Datei nicht auf der Festplatte sondern in einem ByteArray. Mit ZIpFile kann ich nur Dateien öffnen die sich auf der Festplatte befinden und nicht aus einem ByteArray lesen. Kann mit einer helfen?


MFG zerix
 
Hallo!

Schau mal hier:
Code:
 package de.tutorials;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
 public class ByteArrayBasedZipExample {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		File file = new File("c:/sonnenBlume.zip");
 		byte[] buffer = new byte[(int) file.length()];
 
 		FileInputStream fis = new FileInputStream(file);
 		fis.read(buffer);
 		fis.close();
 
 		ZipInputStream zis = new ZipInputStream(
 				new ByteArrayInputStream(buffer));
 
 		ZipEntry entry = null;
 		byte[] entryBuffer = new byte[8192];
 		int len = 0;
 		while ((entry = zis.getNextEntry()) != null) {
 			File entryFile = new File("c:/", System.currentTimeMillis()
 					+ entry.getName());
 			FileOutputStream fos = new FileOutputStream(entryFile);
 			while ((len = zis.read(entryBuffer)) > 0) {
 				fos.write(entryBuffer, 0, len);
 			}
 			fos.flush();
 			fos.close();
 		}
 
 		zis.close();
 
 	}
 }

gruß Tom
 
Danke Tom!!
Aber jetzt steh ich vor dem nächsten Problem. Mit deinem Quelltext kann ich die ganze ZipFile entpacken, aber wie kann ich jetzt ein bestimmtes entry entpacken. Es gibt ja leider nur die Methode nextEntry bei dem ZipInputStream.
 
Hallo!

Das Beispiel von Thomas klappt soweit bei mir, nur wenn die Dateien in der Zip-Datei etwas größer werden (hab es mit einer ca 50 MB großen Datei versucht) bekomme ich eine Exception geworfen:

java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.io.ByteArrayOutputStream.write(Unknown Source)

Ich denke mal, dass intern ein Vector von bytes benutzt wird und der irgendwann zu groß wird und nicht mehr verarbeitet werden kann.

Gibt es eine andere Möglichkeit das zu realisieren. Kann mir dabei jemand helfen?
 
Hallo,

da hast du aber einen meiner ersten Beiträge in diesem Forum gefunden. ;-)

Du bekommst einen OutOfMemoryError, weil der Java-Speicher voll ist. Dieser beträgt soweit ich weiß Standard-mäßig 64 MB. Wenn du dann natürlich 50 MB von einer Datei schon im Speicher hast, ist das recht schell voll.
Eine Möglichkeit wäre, wenn du einfach den Java-Speicher erhöhst.

Code:
java -Xmx256m MyApp

Eine weitere Möglichkeit wäre vielleicht (da ich nicht weiß was du machst), wenn du es nicht in den Speicher schreibst, sondern in ein Temp-File auf die Platte, dann ist die Speicherauslastung nicht so hoch.

MFG

zEriX
 
Zurück