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>
Другие вопросы по тегам