首页 > 解决方案 > GZIPInputStream 适用于 FileInputStream 但不适用于 InputStream

问题描述

我注意到在使用 GZIPInputStream 时,在 gzipped 文件上使用从 Class.class.getResourceAsStream 生成的 InputStream 会导致

java.util.zip.ZipException: invalid code lengths set

在 GZIPInputStream 中使用时,但在同一个文件上使用 FileInputStream 似乎工作正常。有谁知道是什么原因造成的?

例如:

InputStream is = new FileInputStream("src/main/resources/testFile.gz");
GZIPInputStream zis = new GZIPInputStream(is);
String outputStr = IOUtils.toString(zis, "utf-8");

使用解压缩的文件数据成功生成输出字符串,同时:

InputStream is = Class.class.getResourceAsStream("/testFile.gz");
GZIPInputStream zis = new GZIPInputStream(is);
String outputStr = IOUtils.toString(zis, "utf-8");

生成上面的 ZipException。

当我解压缩文件时,我能够在生成的 InputStream 上使用 IOUtils.toString 获得正确的 outputString,因此我知道该文件已成功访问,并且问题似乎与 GZIPInputStream 本身有关。

标签: javainputstreamfileinputstreamgzipinputstream

解决方案


事实证明,Maven 是为什么使用 getResourceAsStream 会生成 ZipException 而 FileInputStream 却没有的罪魁祸首。我在 src/main/resources 下的 gz 文件被 Maven 复制到 target/src/main/resources,随后在应用 Maven 过滤时自动损坏。FileInputStream 以 src/main/resources 下的文件为目标,而 getResourceAsStream 以 target/src/main/resources 下的文件为目标。该问题的解决方案是在 src/main/resources 目录中禁用对我的资源的过滤,如下所示。

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

推荐阅读