我的Java程序实现了一个服务器,应该从客户端通过Websockets获取一个非常大的文件,该文件使用gzip进行压缩,并且应该检查文件内容中的一些字节模式。
客户端发送嵌入在专有协议中的文件块,因此我从客户端获得消息后,解析消息并提取gzipped文件内容。
我无法将整个文件保存在程序内存中,因此我正在尝试解压每个块,处理数据并继续下一个块。
我正在使用以下代码:
但是在使用第一个压缩块调用函数时,我遇到了以下异常:
重要的是要提到我没有跳过任何数据块并且正在按顺序逐个解压缩数据块。 我错过了什么吗?
客户端发送嵌入在专有协议中的文件块,因此我从客户端获得消息后,解析消息并提取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)
重要的是要提到我没有跳过任何数据块并且正在按顺序逐个解压缩数据块。 我错过了什么吗?