web-dev-qa-db-fra.com

L'extraction du fichier compressé à partir de ResourceStream génère l'erreur "Longueur de bloc stockée non valide"

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.

9
PaulBGD

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

7
Gelin Luo

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.

7
PaulBGD

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>
0
Narendra Kekane