0 голосов
 
1957 просмотров
11.04.2019 / 17:06  aNNiMON

Caused by: java.io.EOFException: Unexpected end of ZLIB input stream при декомпрессии gzip

Я сжимаю входной массив байт в gzip и получаю массив байт, который затем используется для декомпрессии.
Но при декомпрессии получаю исключение:
  1. Caused by: java.io.EOFException: Unexpected end of ZLIB input stream
  2.     at java.base/java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:245)
  3.     at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:159)
  4.     at java.base/java.util.zip.GZIPInputStream.read(GZIPInputStream.java:118)
  5.     at java.base/java.io.FilterInputStream.read(FilterInputStream.java:107)

Код:
  1. // Compress gzip
  2. final byte[] input = /* .. */;
  3. try (InputStream is = new ByteArrayInputStream(input);
  4.      ByteArrayOutputStream baos = new ByteArrayOutputStream();
  5.      GZIPOutputStream gzos = new GZIPOutputStream(baos)) {
  6.     copy(is, gzos);
  7.     return baos.toByteArray();
  8. }
  9.  
  10. // Decompress gzip
  11. final byte[] input = /* .. */;
  12. try (InputStream is = new ByteArrayInputStream(input);
  13.      GZIPInputStream gzis = new GZIPInputStream(is);
  14.      ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
  15.     copy(gzis, baos);
  16.     return baos.toByteArray();
  17. }

В чём ошибка? Все потоки закрываю, gzos.flush() тоже пробовал (как при syncFlush, так и без него).
Изм. aNNiMON от 11.04.2019 / 18:56
Ответы
 
1 голос
 
# 11.04.2019 / 17:10  aNNiMON
Причина ошибки в том, что в сжатый массив записываются не все байты. И flush здесь мало поможет.
У GZIPOutputStream есть метод finish(), который и нужно вызывать до закрытия потока:
  1. final byte[] input = /* .. */;
  2. try (InputStream is = new ByteArrayInputStream(input);
  3.      ByteArrayOutputStream baos = new ByteArrayOutputStream();
  4.      GZIPOutputStream gzos = new GZIPOutputStream(baos)) {
  5.     copy(is, gzos);
  6.     gzos.finish();
  7.     return baos.toByteArray();
  8. }
12.04.2019 / 17:38  Koenig
Ну я сразу понял в чем косяк, когда прочитал имя эксепшона EOF
 
0 голосов
 
# 12.04.2019 / 07:48  Exception
Сам спросил , сам ответил :gg:
12.04.2019 / 08:18  MasterOS
Вчера, я тоже подумал об этом :gg: Но потом я отменил, потому что "Банана". Вот несколько слов моим мнениями: "Чё это прикол? Сам спросил, сам отвечал" :gy:
12.04.2019 / 09:10  aNNiMON
Настоятельно рекомендую к ознакомлению https://annimon.com/rules/?id=14
Всего: 2

Реклама

Мы в соцсетях

tw tg yt gt