【发布时间】:2017-04-08 19:32:17
【问题描述】:
我的 Java 程序实现了一个服务器,它应该从客户端通过 websockets 获取一个非常大的文件,使用 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)
重要的是要提到我没有跳过任何块并尝试按顺序解压缩块。
我错过了什么?
【问题讨论】:
-
不清楚这些数据的来源。您应该创建一个将读取所有数据的流,并将其包装在 GZipInputStream 中。它不需要将所有数据都保存在内存中,但它应该是单个流。