# Zip und unzip von byte-Array



## Szdnez (7. September 2009)

Hallo,

ich habe ein byte-Array, welches ich zippen bzw. unzippen möchte. Ich habe soweit auch schon zwei entsprechende funktionierende Methoden geschrieben. 

```
protected final byte[] zip( final byte[] pDaten )
throws IOException
{
	final ByteArrayOutputStream output = new ByteArrayOutputStream();
	final ZipOutputStream zip = new ZipOutputStream( output );
	zip.setMethod( ZipOutputStream.DEFLATED );
	final ZipEntry entry = new ZipEntry( "daten" );

	zip.putNextEntry( entry );
	zip.write( pDaten );
	zip.closeEntry();

	final byte[] bytes = output.toByteArray();

	zip.close();
	output.close();

	return bytes;
}
```


```
protected final byte[] unzip( final byte[] pDaten )
throws IOException
{
	final InputStream input = new ByteArrayInputStream( pDaten );

	// Wie komme ich zu der Länge?
	byte[] daten = new byte[ 1024 ];
	final ZipInputStream zip = new ZipInputStream( input );
	int anzahl = 0;

	if ( zip.getNextEntry() != null )
	{
		anzahl = zip.read( daten );
	}

	zip.close();
	input.close();

	byte[] datenKorrekt = new byte[ anzahl ];
	System.arraycopy( daten, 0, datenKorrekt, 0, anzahl );

	return datenKorrekt;
}
```
Das einzige was mich stört ist in der unzip()-Methode, dass ich die Länge des Arrays festlegen muss, obwohl ich diese noch gar nicht kenne (was passiert, wenn pDaten doch mal länger ist?) und daraus resultierend auch das System.arraycopy().
Vielleicht hat ja jemand von euch diesbezüglich noch eine clevere Idee?

Dankeschön, Szdnez


----------



## zeja (7. September 2009)

Das byte-Array ist nur ein Puffer zum einlesen von x-Bytes auf einmal. Das x wird normalerweise mit 256-2048 angegeben.

Damit du längere Daten einlesen kannst, schreibt du das in deinem Fall wieder in einem ByteArrayOutputStream:


```
protected final byte[] unzip( final byte[] pDaten )
throws IOException
{
	final InputStream input = new ByteArrayInputStream( pDaten );

	final byte[] buffer = new byte[ 1024 ];
	final ZipInputStream zip = new ZipInputStream( input );
	final ByteArrayOutputStream out = new ByteArrayOutputStream(pDaten.length); // ungefähre Länge durch das gezippte Array angeben
	int anzahl = 0;

	if ( zip.getNextEntry() != null )
	{
                while((anzahl = zip.read(daten)) != -1) { // -1 = Stream-Ende
                      out.write(daten, 0, anzahl); // Nur die gelesene Zahl von Bytes schreiben
               }
	}

	zip.close();
	out.close();

	return out.toByteArray();
}
```


----------



## Szdnez (8. September 2009)

Dankeschön


----------

