GZIPInputStream macht Probleme...

yigiter

Mitglied
Hallo zusammen,

Client - Sever kommunikation, Server sendet Daten als Zip. Beim entpacken kommt leider eine Exception..

Gezippt wird wie folgt auf einem Linux Rechner
Code:
public byte[] zip(String data) throws IOException {
		ByteArrayOutputStream bOut = new ByteArrayOutputStream(data.length());
		byte[] bytes = data.getBytes(CHARSET_UTF_8);
		GZIPOutputStream zOut = new GZIPOutputStream(bOut);
		zOut.write(bytes);
		zOut.close();
		bOut.close();

		return bOut.toByteArray();
	}

Unzip auf einem Xp Rechner..
Code:
public String unzip(byte[] data) throws IOException {
		InputStream fin = new GZIPInputStream(new ByteArrayInputStream(data));
		ByteArrayOutputStream fout = new ByteArrayOutputStream();
		copy(fout, fin, 1024);
		fin.close();
		fout.close();
		return new String(fout.toByteArray(), CHARSET_UTF_8);
	}

	private static void copy(OutputStream out, InputStream in, int bufferSize) throws IOException {
		InputStream bIn = new BufferedInputStream(in, bufferSize);
		OutputStream bOut = new BufferedOutputStream(out, bufferSize);
		byte[] buffer = new byte[bufferSize];

		for (int len; (len = bIn.read(buffer, 0, bufferSize)) != -1;) {
			bOut.write(buffer, 0, len);
		}
		bIn.close();
		bOut.close();
	}

Leider kommt es öffteren die Exception
Code:
java.io.IOException: Corrupt GZIP trailer
	at java.util.zip.GZIPInputStream.readTrailer(Unknown Source)
	at java.util.zip.GZIPInputStream.read(Unknown Source)
	at java.io.BufferedInputStream.fill(Unknown Source)
	at java.io.BufferedInputStream.read1(Unknown Source)
	at java.io.BufferedInputStream.read(Unknown Source)

Keine Ahnung warum die Exception kommt...

Hat einer eine Idee?

Vielen Dank im Voraus...
 
Hallo,

was heißt denn
"Leider kommt es öffteren die Exception" ? Wie oft passiert das denn nun, immer, oder nur manchmal?
Wenn man sich die readTrailer() Methode in GZipInputStream anschaut:
Java:
   /*
     * Reads GZIP member trailer.
     */
    private void readTrailer() throws IOException {
    InputStream in = this.in;
    int n = inf.getRemaining();
    if (n > 0) {
        in = new SequenceInputStream(
            new ByteArrayInputStream(buf, len - n, n), in);
    }
    // Uses left-to-right evaluation order
    if ((readUInt(in) != crc.getValue()) ||
        // rfc1952; ISIZE is the input size modulo 2^32
        (readUInt(in) != (inf.getBytesWritten() & 0xffffffffL)))
        throw new IOException("Corrupt GZIP trailer");
    }
So sieht man, dass die entsprechende Exception nur geworfen wird, wenn die CRC Prüfsumme nicht stimmt, oder
die Anzahl der übertragenen Bytes nicht passt.

Versuchs doch mal mit einem explizitem finish() beim zip:
Java:
public static byte[] zip(byte[] data) throws IOException{
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
        gzipOutputStream.write(data);
        gzipOutputStream.finish();
        gzipOutputStream.close();
        return byteArrayOutputStream.toByteArray();
    }

Gruß Tom
 
Zurück