現在の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)
私はこれを間違っていますか?私はたくさんのエラーをグーグルで調べました、そして私の問題に関連するものを何も見ませんでした。
上記の@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
に変更せずに私の問題を修正しました
さらに数時間検索した後、maven-resources-pluginを逆コンパイルすると、デフォルトでUTF-8エンコーディングが使用されていることに気付きました。必要なエンコーディング(ISO-8859-1)をすぐに調べて、ポンポンに入れました。
<properties>
<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>
これで、Zipファイルは完全にjarにコピーされ、破損はまったくありません。
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>