web-dev-qa-db-ja.com

ResourceStreamからzipファイルを抽出すると、「保存されたブロック長が無効です」というエラーがスローされる

現在のJARからZipファイルを抽出しようとしています:

InputStream resource = getClass().getClassLoader().getResourceAsStream(name);

これは正しいInputStreamを取得しますが、次のコードを使用して解凍しようとするとエラーが発生します(各ファイルをHashmap<file, filename>):

public static HashMap<String, String> readZip(InputStream inputStream) throws IOException {
    byte[] buffer = new byte[1024];
    HashMap<String, String> list = new HashMap<>();
    ZipInputStream zipInputStream = new ZipInputStream(inputStream);
    ZipEntry entry = zipInputStream.getNextEntry();
    while (entry != null) {
        if (!entry.isDirectory()) {
            StringBuilder stringBuilder = new StringBuilder();
            while (IOUtils.read(zipInputStream, buffer) > 0) {
                stringBuilder.append(new String(buffer, "UTF-8"));
            }
            list.put(stringBuilder.toString(), entry.getName());
        }
        zipInputStream.closeEntry();
        entry = zipInputStream.getNextEntry();
    }
    zipInputStream.closeEntry();
    zipInputStream.close();
    return list;
}

ただし、これを実行しようとすると、この例外が発生します(IOUtils.read

Java.util.Zip.ZipException: invalid stored block lengths
   at Java.util.Zip.InflaterInputStream.read(Unknown Source)
   at Java.util.Zip.ZipInputStream.read(Unknown Source)

私はこれを間違っていますか?私はたくさんのエラーをグーグルで調べました、そして私の問題に関連するものを何も見ませんでした。

11
PaulBGD

上記の@PaulBGDの回答に感謝します。私のシステムに何が起こったかを理解するのに何時間も節約できました。次の新しいスニペットをpom.xmlファイルに追加しました(ポールの答えを読む前に根本的な原因であることがわかりませんでした)。

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
      <include>**/*.version</include>
      <include>**/*.properties</include>
      <include>**/*.xml</include>
      <include>**/*.csv</include>
      <include>**/*.txt</include>
      <include>**/*.gif</include>
      <include>**/*.json</include>
      <include>**/*.xlsx</include>
      <include>rythm/**</include>
    </includes>
  </resource>
</resources>

ただし、Paulの回答を直接受け取らず、代わりに、これらのxlsxファイルがリソースプラグインのフィルタリングパイプラインを通過するとは思わないため、pomに別のresourceを追加しました。

  <resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
    <includes>
      <include>**/*.xlsx</include>
    </includes>
  </resource>

そして、それはソースエンコーディング設定をUTF-8からISO-8859-1に変更せずに私の問題を修正しました

7
Gelin Luo

さらに数時間検索した後、maven-resources-pluginを逆コンパイルすると、デフォルトでUTF-8エンコーディングが使用されていることに気付きました。必要なエンコーディング(ISO-8859-1)をすぐに調べて、ポンポンに入れました。

<properties>
    <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>

これで、Zipファイルは完全にjarにコピーされ、破損はまったくありません。

7
PaulBGD

Spring-boot-starter-parentを2.0.4.RELEASEに変更します。それは私のために働いた。

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath />
    </parent>
0
Narendra Kekane