Extrahieren der Zip-Datei von ResourceStream wirft Fehlermeldung "Invalid block gespeichert Längen"

Ich versuche, extrahieren Sie eine ZIP-Datei von meinem aktuellen JAR mit:

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

Diese Holen Sie sich die richtige InputStream, aber es gibt einen Fehler, wenn ich versuche zu entpacken Sie es mit dem folgenden code (ich bin Speicherung jeder einzelnen Datei in ein 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;
}

Jedoch, wenn ich versuche, dies zu tun, bekomme ich diese exception (auf 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 getan, viel googeln des Fehlers, und ich wollte nicht sehen, nichts in Bezug auf mein Problem.

  • Also Ihr GLAS enthält einen Eintrag, der gezippt ist? Sie wollen zum Lesen der bytes, die dieser Eintrag und Las es durch eine ZipInputStream?
  • Ja, ich denke, das war es
  • Dies legt nahe, die Datei ist beschädigt. Versuchen Sie, entpacken Sie es mit einem normalen unzip-Dienstprogramm.
  • Funktioniert einwandfrei, wenn ich die Datei aus dem Glas, nachdem ich es kompiliert haben. So ich raten bin, maven/java ist etwas tun, um es beim kompilieren?
  • Unabhängig davon, du machst einen schweren Fehler in der Verknüpfung der Daten in einem StringBuilder-Objekt und speichern Sie es als String. Erste, Sie nicht einmal tun, richtig, wie Sie sind ignoriert die lese-zählen beim konstruieren jede Zeichenfolge. Zweitens, String ist kein container für binäre Daten. Sie sollten kopieren Sie jeden Eintrag, um einen ByteArrayOutputStream und zurück eine HashMap<String, byte[]>.
  • Okay, tun (dies schrieb, ziemlich spät in der Nacht, wie üblich). Alles, was Sie können ableiten, über die wichtigste Frage aber?
  • Hauptproblem ist, dass die Ressource beschädigt ist, oder ist nicht eine ZIP-Datei überhaupt. Wie genau baust du es?
  • mvn clean install? Oder die ZIP-Datei, es ist erstellt mit Windows.
  • Von dem, was es scheint, wenn es kompiliert die zip beschädigt wird, in das Glas.
  • Nur eine minute. Es gibt eine große unerklärliche Distanz zwischen dem ausführen von maven und das bauen an.zip Datei und das hinzufügen von es in ein GLAS, und keiner davon beinhaltet die Zusammenstellung.
  • Wenn maven kompiliert wird, verwendet es die Maven Ressource Plugin zum hinzufügen von Dateien in das endgültige Gefäß. Es scheint, dass es standardmäßig UTF-8 verwendet, das war die Zerstörung der zip.

InformationsquelleAutor PaulBGD | 2014-08-11
Schreibe einen Kommentar