Java 프로그램은 웹 소켓을 통해 클라이언트에서 gzip을 사용하여 압축 된 매우 큰 파일을 가져와야하며 서버에서 파일 내용의 일부 바이트 패턴을 확인해야합니다.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)
그것은 그 I를 언급하는 것이 중요합니다을 어떤 청크도 건너 뛰지 않고 순차적으로 청크를 압축 해제하려고하지 않습니다.
무엇이 누락 되었습니까?
이 데이터의 출처는 분명하지 않습니다. * 모든 * 데이터를 읽을 스트림을 하나 만들고 GZipInputStream에 래핑해야합니다. 메모리 *에 모든 데이터 *가있을 필요는 없지만 단일 스트림이어야합니다. –