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

Pau*_*BGD 11 java zip embedded-resource maven

我试图从我当前的JAR中提取ZIP文件:

InputStream resource = getClass().getClassLoader().getResourceAsStream(name);
Run Code Online (Sandbox Code Playgroud)

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

但是当我尝试这样做时,我得到了这个例外(上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)
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*BGD 7

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

<properties>
    <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>
Run Code Online (Sandbox Code Playgroud)

现在,zip文件完美地复制到jar中,没有任何损坏.


Gel*_*Luo 7

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

  <resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
    <includes>
      <include>**/*.xlsx</include>
    </includes>
  </resource>
Run Code Online (Sandbox Code Playgroud)

它修复了我的问题,而没有将源编码设置更改UTF-8ISO-8859-1