我正在尝试将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中出现问题的原因。