GZIPInputStream работает с FileInputStream, но не с InputStream
При работе с GZIPInputStream я заметил, что использование InputStream, сгенерированного из Class.class.getResourceAsStream для gzipped файла, вызывает
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 выше.
Когда я распаковываю файл, я могу получить правильный outputString, используя IOUtils.toString для InputStream, сгенерированного в любом случае, так что я знаю, что к файлу обращаются успешно, и проблема, похоже, связана с GZIPInputStream.
1 ответ
Оказывается, Maven является виновником того, почему при использовании getResourceAsStream генерировалось исключение ZipException, а FileInputStream - нет. Файлы gz, которые я имел в src / main / resources, копировались в target / src / main / resources Maven и впоследствии автоматически повреждались при применении фильтрации 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>