Неожиданный конец входного потока ZLIB - PullRequest
7 голосов
/ 25 августа 2011

Я пытаюсь выполнить обход данных строки JSON в байтовом массиве с помощью DeflaterOutputStream, но код ниже выдает java.io.EOFException: Unexpected end of ZLIB input stream.

. Это работает, когда вы заменяете строку на «Hello world», илиесли вы удалите несколько символов из строки ниже.

Есть идеи?

public static void main(String[] args) throws IOException {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    DeflaterOutputStream deflate = new DeflaterOutputStream(bytes, new Deflater(Deflater.BEST_COMPRESSION, true));
    OutputStreamWriter writer = new OutputStreamWriter(deflate);
    writer.write("[1,null,null,\"a\",null,null,null,null,[1,null,null,null,null,null,null,null,null,null,null,null,null,0.0,0.0,null,null]");
    writer.flush();
    writer.close();

    InflaterInputStream inflaterIn = new InflaterInputStream(new ByteArrayInputStream(bytes.toByteArray()), new Inflater(true));
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inflaterIn));
    System.out.println(bufferedReader.readLine());
}

Java-версия (OSX):

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode)

Ответы [ 2 ]

13 голосов
/ 21 января 2012

У меня была эта проблема, и это потому, что я неправильно закрывал выходные потоки.

8 голосов
/ 25 августа 2011

Я полагаю, что это связано с опцией "без переноса", для которой вы передаете "true" как в Deflater, так и в Inflater.Установка обоих значений на false устраняет проблему - хотя я рекомендую установить кодировку строк в обоих местах (например, в UTF-8) вместо использования кодировки по умолчанию системы.

Документы для "nowrap "довольно расплывчаты, но в них указано:

Примечание: при использовании опции nowrap также необходимо предоставить дополнительный" фиктивный "байт в качестве входных данных.Это требуется собственной библиотекой ZLIB для поддержки определенных оптимизаций.

Предположительно, этот фиктивный входной байт отсутствует, хотя и не объясняет, куда он должен идти ...

...