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

时间:2014-08-11 02:45:13

标签: java maven zip embedded-resource

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

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

这会得到正确的InputStream,但是当我尝试使用以下代码解压缩它时会出错(我将每个文件存储到Hashmap<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)

我这样做错了吗?我已经做了很多关于错误的谷歌搜索,而且我没有看到与我的问题有关的任何内容。

3 个答案:

答案 0 :(得分:7)

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

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

现在,zip文件完全复制到jar中,没有任何损坏。

答案 1 :(得分:7)

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

<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的回答,而是我认为这些xlsx文件不应该通过资源插件的过滤管道,因此我添加了另一个resource进入pom:

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

它修复了我的问题而未将源代码编码设置从UTF-8更改为ISO-8859-1

答案 2 :(得分:0)

将spring-boot-starter-parent更改为2.0.4.RELEASE。它对我有用。

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath />
    </parent>