# Länge eines Streams



## Johannes L. (3. Jun 2007)

Hi,

wie bekomme ich die Länge eines GZIPOutputStreams heraus, die ich für den HTTP Content-Length Header brauche?


```
logger.debug("Encode as GZip data!");

byte[] BinaryBody = new byte[8192];

GZIPOutputStream gzipOut = new GZIPOutputStream(client
		.getOutputStream());

int length;

while ((length = in.read(BinaryBody)) != -1)
{
	gzipOut.write(BinaryBody, 0, length);
	gzipOut.flush();
}

gzipOut.close();
```

Viele Grüsse,
Johannes


----------



## semi (3. Jun 2007)

Gar nicht. Ein Stream hat keine Länge, ist nur eine Datenschleuse.

Wenn die Datemenge nicht zu gross ist, kannst du zuerst mal in ein ByteArrayOutputStream schreiben,
die Länge ausgeben und anschliessend das Byte-Array.


----------



## Johannes L. (7. Jun 2007)

semi hat gesagt.:
			
		

> Gar nicht. Ein Stream hat keine Länge, ist nur eine Datenschleuse.
> 
> Wenn die Datemenge nicht zu gross ist, kannst du zuerst mal in ein ByteArrayOutputStream schreiben,
> die Länge ausgeben und anschliessend das Byte-Array.



Müsste es dann nicht quasi


```
InputStream in = method.getResponseBodyAsStream();
		
byte[] BinaryBody = new byte[8192];
		
ByteArrayOutputStream baOut = new ByteArrayOutputStream();
		
GZIPOutputStream gzipOut = new GZIPOutputStream(baOut);
		
int length;

while ((length = in.read(BinaryBody)) != -1)
{
	gzipOut.write(BinaryBody, 0, length);
	gzipOut.flush();
}

gzipOut.close();
		
byte[] compressedData = baOut.toByteArray();

to_client.write("Content-Length: "+compressedData.length+"\r\n\r\n");
to_client.write(compressedData.toString());
to_client.flush();
```

sein? Dummerweise sagt mir das JUnit Testcase nun, dass es nicht mehr im gzip-Format wäre...


```
// start request
    try {
      int statusCode = client.executeMethod(method);

      // do not accept failure
      assertEquals(HttpStatus.SC_OK, statusCode);

      // read the (compressed!) response body and gunzip it
      GZIPInputStream gin = new GZIPInputStream(method
          .getResponseBodyAsStream());
      byte[] uncompressedBinaryBody = new byte[8192];
      StringBuffer body = new StringBuffer();
      int length;
      while ((length = gin.read(uncompressedBinaryBody)) != -1) {
        body.append(new String(uncompressedBinaryBody, 0, length));
      }

      // do not accept wrong body
      assertEquals(GET_BODY, body.toString());

    } catch (Exception e) {
      fail(e.getLocalizedMessage());
    } finally {
      method.releaseConnection();
    }
  }
```


----------



## Guest (7. Jun 2007)

Warum Ende des Response-Headers hier? Schreibst du den ganzen Rest irgendwo davor?
	
	
	
	





```
to_client.write("Content-Length: "+compressedData.length+"\r\n\r\n");
```
toString() ist definitiv falsch. Schreibe das Array rein.
	
	
	
	





```
to_client.write(compressedData.toString());
```


----------



## Johannes L. (7. Jun 2007)

ups stimmt, muss ich grade mal testen. Ja ich schreibe die Header in einer Methode, erzeuge die gezippten Daten in einer anderen Methode ... was auch ein Problem war, da ich die ganzen Daten dann immer weitergeben musste, also das Byte Array beispielsweise...


----------

