我的Java程序实现了一个服务器,该服务器应该从客户端通过websockets获取一个使用gzip压缩的非常大的文件,并检查文件内容中的某些字节模式。Java按顺序解压缩GZIP流
客户端发送嵌入专有协议内的文件块,以便在客户端收到消息后解析消息并提取gzip文件内容。
我无法在程序存储器中保存整个文件,所以我试图解压每个块,处理数据并继续到下一个块。
我用下面的代码:
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)
重要的是要提的是我很重要不会跳过任何块并尝试按顺序解压块。
我错过了什么?
目前尚不清楚这些数据是从哪里开始的。您应该创建一个读取* all *数据的流,并将其包装在GZipInputStream中。它不需要在内存中拥有所有数据*,但它应该是单个流。 –