java.util.zip.ZipException: неверная длина сохраненного блока

Я пытаюсь прочитать ZipArchiveEntry в String. У меня есть код ниже, и я столкнулся с исключением

Мой код, как показано ниже

StringWriter writer = new StringWriter();
IOUtils.copy(zipFile.getInputStream(zipArchiveEntry),
              writer,
              org.apache.commons.io.Charsets.UTF_8);

И я получаю следующее исключение

java.util.zip.ZipException: invalid stored block lengths
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:147)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.Reader.read(Reader.java:123)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2001)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1980)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1957)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1907)

Действительно застрял на нем надолго. Пожалуйста, помогите.


person Vinod Jayachandran    schedule 25.02.2013    source источник
comment
Вы можете открыть zip-файл с помощью обычной zip-программы?   -  person jtahlborn    schedule 25.02.2013
comment
@jtahlborn Да, очень.   -  person Vinod Jayachandran    schedule 25.02.2013
comment
Рассмотрите возможность использования нового файлового API NIO.2. Oracle JDK поставляется с поставщиком файловой системы для ZIP/JAR.   -  person Puce    schedule 25.02.2013


Ответы (1)


У меня был похожий случай с действительно действительным ZIP-файлом, но мне было трудно прочитать его с помощью Java. Исключение было похоже на ваше, но с другой трассировкой стека:

Caused by: java.util.zip.ZipException: invalid stored block lengths
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
at java.util.zip.ZipInputStream.read(ZipInputStream.java:194)
at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:140)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:118)
...

В моем случае «неисправный» ZIP-файл был создан с помощью «архивного» модуля Ansible на компьютере с CentOS:

- name: Create a zip archive
  archive:
    path: /tmp/mydir/
    dest: /tmp/mydir.zip
    format: zip

Исправление заключалось в добавлении звездочки в конце «пути» при создании ZIP:

- name: Create a zip archive
  archive:
    path: /tmp/mydir/*
    dest: /tmp/mydir.zip
    format: zip

Содержимое двух ZIP-файлов одинаково, но есть некоторые различия в атрибутах файла/каталога в ZIP-файле, которые, по-видимому, вызывают проблему в Java.

person MosheElisha    schedule 21.01.2020