我的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中。它不需要在內存中擁有所有數據*,但它應該是單個流。 –