# ZipFIle ByteArray



## zerix (21. September 2005)

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


----------



## Thomas Darimont (21. September 2005)

Hallo!

 Schau mal hier:

```
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


----------



## zerix (21. September 2005)

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.


----------



## zerix (21. September 2005)

ICh hab mal ne Idee. Ich hoffe das es funktioniert.


----------



## mmueller78 (9. August 2007)

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?


----------



## zerix (9. August 2007)

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.


```
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


----------

