从 ResourceStream 中提取压缩文件会引发错误“存储的块长度无效”

2022-09-04 20:23:55

我正在尝试使用以下命令从当前JAR中提取ZIP文件:

InputStream resource = getClass().getClassLoader().getResourceAsStream(name);

这得到了正确的,但是当我尝试使用以下代码解压缩它时,它给出了一个错误(我将每个文件存储到一个):InputStreamHashmap<file, filename>

public static HashMap<String, String> readZip(InputStream inputStream) throws IOException {
    byte[] buffer = new byte[1024];
    HashMap<String, String> list = new HashMap<>();
    ZipInputStream zipInputStream = new ZipInputStream(inputStream);
    ZipEntry entry = zipInputStream.getNextEntry();
    while (entry != null) {
        if (!entry.isDirectory()) {
            StringBuilder stringBuilder = new StringBuilder();
            while (IOUtils.read(zipInputStream, buffer) > 0) {
                stringBuilder.append(new String(buffer, "UTF-8"));
            }
            list.put(stringBuilder.toString(), entry.getName());
        }
        zipInputStream.closeEntry();
        entry = zipInputStream.getNextEntry();
    }
    zipInputStream.closeEntry();
    zipInputStream.close();
    return list;
}

但是,当我尝试执行此操作时,我得到此异常(在IOUtils.read)

java.util.zip.ZipException: invalid stored block lengths
   at java.util.zip.InflaterInputStream.read(Unknown Source)
   at java.util.zip.ZipInputStream.read(Unknown Source)

我做错了吗?我已经对错误进行了大量的谷歌搜索,但我没有看到与我的问题相关的任何内容。


答案 1

感谢@PaulBGD上面的回答。它节省了我几个小时来弄清楚我的系统发生了什么,我将以下新片段添加到我的文件中(在阅读Paul的答案之前,我没有意识到这是根本原因):pom.xml

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
      <include>**/*.version</include>
      <include>**/*.properties</include>
      <include>**/*.xml</include>
      <include>**/*.csv</include>
      <include>**/*.txt</include>
      <include>**/*.gif</include>
      <include>**/*.json</include>
      <include>**/*.xlsx</include>
      <include>rythm/**</include>
    </includes>
  </resource>
</resources>

然而,我没有直接接受Paul的答案,相反,我认为这些文件不应该通过资源插件的过滤管道,因此我在pom中添加了另一个:xlsxresource

  <resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
    <includes>
      <include>**/*.xlsx</include>
    </includes>
  </resource>

它解决了我的问题,而无需将源编码设置从 更改为UTF-8ISO-8859-1


答案 2

经过几个小时的搜索,我反编译了maven-resources-plugin,并注意到它默认使用UTF-8编码。我快速查找了我需要的编码(ISO-8859-1),并将其放入我的pom中。

<properties>
    <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>

现在,zip文件完美地复制到jar中,根本没有损坏。


推荐