java - 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 本身有关。
解决方案
事实证明,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>
推荐阅读
- java - 当一个子类调用另一个子类时,哪种面向对象设计更好?
- r - R根据包括日期差异在内的多个标准的逻辑索引汇总数据
- rake - 如何设置 rake 来编译 mruby gem?
- arrays - 有没有办法将工作表中的数据值读取到索引为 1 而不是 0 的数组中?
- java - JPanel 没有在 setSize 方法中设置大小
- swagger - .net core 3.1 带有 swagger/swashbuckler 没有控制器属性
- swift - 如何使用 AWS Amplify 检查当前用户会话?
- python - 从 DetailView 更新 Django 模型
- swiftui - SwiftUI Preview 因链接器错误而失败
- xaml - Xamarin.Forms 如何将文本/标签放在 BoxView 元素上?