我注意到在使用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有关。
答案 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>