wake-up-neo.com

Das Extrahieren der komprimierten Datei aus ResourceStream gibt den Fehler "Ungültige gespeicherte Blocklängen" aus.

Ich versuche, eine ZIP-Datei aus meinem aktuellen JAR zu extrahieren:

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

Dies liefert den korrekten InputStream, aber es gibt einen Fehler, wenn ich versuche, es mit folgendem Code zu entpacken (ich speichere jede Datei in einem 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;
}

Wenn ich dies jedoch versuche, erhalte ich diese Ausnahme (bei 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)

Mache ich das falsch? Ich habe den Fehler ausgiebig gegoogelt und nichts mit meinem Problem in Verbindung gebracht.

9
PaulBGD

Vielen Dank an @ PaulBGDs Antwort. Es hat mir Stunden gespart, um herauszufinden, was mit meinem System passiert ist. Ich füge die folgenden neuen Ausschnitte in meine pom.xml-Datei ein (was ich nicht wusste, ist die Hauptursache, bevor ich Pauls Antwort gelesen habe):

<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>

Ich habe die Antwort von Paul jedoch nicht direkt angenommen, stattdessen denke ich nicht, dass diese xlsx-Dateien die Filterpipeline des Resource Plugins durchlaufen sollten. Daher fügte ich eine weitere resource in pom hinzu:

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

Und es wurde mein Problem behoben, ohne die Quellcodierungseinstellung von UTF-8 in ISO-8859-1 zu ändern.

7
Gelin Luo

Nach einigen weiteren Stunden der Suche dekompilierte ich das maven-resources-plugin und stellte fest, dass es standardmäßig die UTF-8-Codierung verwendete. Ich suchte schnell nach der benötigten Kodierung (ISO-8859-1) und steckte sie in meinen Pom.

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

Nun wird die Zip-Datei perfekt in das Glas kopiert, und zwar ohne Korruption.

7
PaulBGD

Ändern Sie Spring-Boot-Starter-Parent zu 2.0.4.RELEASE. Es hat für mich funktioniert.

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