Подтвердить что ты не робот

Исключение: Неожиданный конец входного потока 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, записывает однобайтное 10 форматирование по GZIP и считывает байт в том же файле в том же формате.

И вот что я получил от него:

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)

По какой-то причине линия чтения кажется неправильной.

Я искал ошибку Unexpected end of ZLIB input stream и нашел некоторые отчеты об ошибках для Oracle, выпущенные в 2007-2010 годах. Таким образом, я думаю, ошибка все еще остается в некотором роде, но я не уверен, что мой код прав, поэтому позвольте мне опубликовать это здесь и послушать ваши советы. Спасибо!

4b9b3361

Ответ 1

Вы должны вызвать close() на GZIPOutputStream, прежде чем пытаться его прочитать. Окончательные байты файла будут записываться только тогда, когда файл фактически закрыт. (Это независимо от какой-либо явной буферизации в стеке вывода. Поток знает только, чтобы сжимать и записывать последние байты, когда вы приказываете закрыть его. flush(), вероятно, не поможет... хотя вызов finish() вместо close() должен работать. Посмотрите на javadocs.)

Здесь правильный код (в Java);

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());
    }
}

(Я не правильно использовал управление ресурсами. Не рассматривайте это как пример "хорошего кода".)