java.util.zip.ZipException : invalid stored block lengths

标签 java apache-commons-io apache-commons-compress

我正在尝试将 ZipArchiveEntry 读取为字符串。我有下面的代码,但遇到了异常

我的代码如下

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)

真的坚持了很久。请大家帮忙。

最佳答案

我也遇到过类似的情况,一个明显有效的 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 是使用 CentOS 计算机上的 Ansible“存档”模块创建的:

- 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 中的问题。

关于java.util.zip.ZipException : invalid stored block lengths,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15071461/

相关文章:

java - 设置数组的值不起作用 - 为什么?

java - startActivityForResult 之后 Android 旋转

java - Log4j2 使用 {} 反对使用 %d 或 %s

java - 在应用程序之外记录击键

java - 使用 FileUtils.listFiles 递归查找目录

java - 使用 Apache commons-io IOUtils.closeQuietly 安全吗?

java - 从临时目录读取 SQLite 文件时获取 java.io.EOFException

java - Java 中使用的最快且内存效率最高的 BZip2 解压工具是什么

java - 使用 IOUtils.copy() 时套接字流挂起

java - 7-zip 存档内的文件列表需要几秒钟才能完成