Javaプログラムは、gzipを使用して圧縮された非常に大きなファイルをWebソケット上のクライアントから取得する必要があるサーバーを実装しています。JavaはGZIPストリームを順番に解凍します。
クライアントは独自のプロトコルに埋め込まれたファイルチャンクを送信するので、クライアントからのメッセージの後にメッセージが表示され、メッセージを解析してgzippedファイルの内容を抽出します。
ファイル全体をプログラムメモリに保持できないため、各チャンクを解凍し、データを処理して次のチャンクに進みます。
私は次のコードを使用しています:
public static String gzipDecompress(byte[] compressed) throws IOException {
String uncompressed;
try (
ByteArrayInputStream bis = new ByteArrayInputStream(compressed);
GZIPInputStream gis = new GZIPInputStream(bis);
Reader reader = new InputStreamReader(gis);
Writer writer = new StringWriter()
) {
char[] buffer = new char[10240];
for (int length = 0; (length = reader.read(buffer)) > 0;) {
writer.write(buffer, 0, length);
}
uncompressed = writer.toString();
}
return uncompressed;
}
をしかし、最初に圧縮されたチャンクで関数を呼び出すときに、私は次の例外を取得しています:
java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.Reader.read(Reader.java:140)
それは私ことを言及することが重要ですチャンクをスキップせず、チャンクを順番に解凍しようとしません。
私には何が欠けていますか?
このデータがどこから来るのかは不明です。 *すべての*データを読み込むストリームを1つ作成し、GZipInputStreamでラップする必要があります。メモリ*にすべてのデータ*を入れる必要はありませんが、単一のストリームでなければなりません。 –