복붙노트

[SCALA] 예외 : ZLIB 입력 스트림의 예기치 않은 종료

SCALA

예외 : ZLIB 입력 스트림의 예기치 않은 종료

GZIPInputStream 또는 GZIPOutputStream에 뭔가 잘못이있다. 그냥 다음 코드를 읽고 (또는 실행 무슨 일이 일어 참조)하십시오 :

def main(a: Array[String]) {
    val name = "test.dat"
    new GZIPOutputStream(new FileOutputStream(name)).write(10)
    println(new GZIPInputStream(new FileInputStream(name)).read())
}

또한, 파일을 생성 TEST.DAT GZIP 포맷으로 단일 바이트 (10)를 기록하고, 동일한 형식으로 동일한 파일에 바이트를 읽는다.

그리고 이것은 내가 그것을 실행있어 것입니다 :

Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
    at java.util.zip.InflaterInputStream.fill(Unknown Source)
    at java.util.zip.InflaterInputStream.read(Unknown Source)
    at java.util.zip.GZIPInputStream.read(Unknown Source)
    at java.util.zip.InflaterInputStream.read(Unknown Source)
    at nbt.Test$.main(Test.scala:13)
    at nbt.Test.main(Test.scala)

판독 라인은 어떤 이유로 잘못된 방향으로가는 것 같다.

나는 ZLIB 입력 스트림의 오류 예기치 않은 끝을 봤와 2007-2010 주위에 발행 된 오라클, 몇 가지 버그 리포트를 발견했다. 내가 버그를 추측 그래서 여전히 어떤 방법으로 남아 있지만 잘 모르겠어요 내 코드가 맞다면, 그래서 내가 여기를 게시하고 조언을들을 수 있습니다. 감사합니다!

해결법

  1. ==============================

    1.당신은 당신이 그것을 읽을하기 전에 close ()를 GZIPOutputStream에 전화를해야합니다. 실제로 파일이 닫힐 때 파일의 마지막 바이트 만 기록됩니다. (이 출력 스택의 명시 적 버퍼링 관계없이입니다. 스트림은 압축을 알고 당신이 가깝습니다. 플러시 (로 말할 때 마지막 바이트 쓰기) 아마하지 않습니다 도움 ... 마무리를 호출하지만 () 대신 가까이 () 작동합니다. JavaDoc을 봐.)

    당신은 당신이 그것을 읽을하기 전에 close ()를 GZIPOutputStream에 전화를해야합니다. 실제로 파일이 닫힐 때 파일의 마지막 바이트 만 기록됩니다. (이 출력 스택의 명시 적 버퍼링 관계없이입니다. 스트림은 압축을 알고 당신이 가깝습니다. 플러시 (로 말할 때 마지막 바이트 쓰기) 아마하지 않습니다 도움 ... 마무리를 호출하지만 () 대신 가까이 () 작동합니다. JavaDoc을 봐.)

    여기에 (자바) 올바른 코드입니다;

    package test;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.zip.GZIPInputStream;
    import java.util.zip.GZIPOutputStream;
    
    public class GZipTest {
    
        public static void main(String[] args) throws FileNotFoundException, IOException {
            String name = "/tmp/test";
            GZIPOutputStream gz = new GZIPOutputStream(new FileOutputStream(name));
            gz.write(10);
            gz.close();
            System.out.println(new GZIPInputStream(new FileInputStream(name)).read());
        }
    }
    

    (I 제대로 자원 관리를 구현 적이 없다. "좋은 코드"의 예로서이 취급하지 마십시오.)

  2. from https://stackoverflow.com/questions/24531089/exception-unexpected-end-of-zlib-input-stream by cc-by-sa and MIT license