J'essaie d'extraire un fichier Zip de mon JAR actuel en utilisant:
InputStream resource = getClass().getClassLoader().getResourceAsStream(name);
Cela récupère la InputStream
correcte, mais cela donne une erreur lorsque j'essaie de la décompresser à l'aide du code suivant (je stocke chaque fichier dans un 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;
}
Cependant, lorsque j'essaie de faire cela, j'obtiens cette exception (sur 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)
Est-ce que je fais mal? J'ai fait beaucoup de recherches sur Google à propos de l'erreur et je n'ai rien vu de lié à mon problème.
Merci à la réponse de @ PaulBGD ci-dessus. Cela m'a permis d'économiser des heures pour comprendre ce qui est arrivé à mon système. J'ai ajouté les nouveaux extraits suivants dans mon fichier pom.xml
(dont je n'avais pas conscience que c'était la cause principale avant de lire la réponse de Paul):
<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>
Cependant, je n'ai pas pris la réponse de Paul directement, mais je ne pense pas que ces fichiers xlsx
doivent passer par le pipeline de filtrage du plugin de ressources, j'ai donc ajouté une autre resource
à pom:
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.xlsx</include>
</includes>
</resource>
Et cela a résolu mon problème sans changer le paramètre de codage source de UTF-8
à ISO-8859-1
Après quelques heures supplémentaires de recherche, j'ai décompilé le plug-in maven-resources-plugin et constaté qu'il utilisait le codage UTF-8 par défaut. J'ai rapidement recherché l'encodage dont j'avais besoin (ISO-8859-1) et l'ai mis dans mon pom.
<properties>
<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>
Maintenant, le fichier Zip copie parfaitement dans le bocal, pas de corruption du tout.
Changez spring-boot-starter-parent en 2.0.4.RELEASE. Cela a fonctionné pour moi.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath />
</parent>