GZIPInputStream适用于FileInputStream但不适用于InputStream

时间:2018-05-29 23:29:00

标签: java inputstream fileinputstream gzipinputstream

我注意到在使用GZIPInputStream时,在gzip压缩文件上使用从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有关。

1 个答案:

答案 0 :(得分:1)

事实证明,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>