ZipInputStream.getNextEntry gibt bei einigen Zip-Dateien null zurück

8

Ich habe einen einfachen Code, um Zip-Dateien zu extrahieren, es funktionierte wie erwartet, aber während meines Tests habe ich meinen Code mit einigen Zip-Dateien ausprobiert (Schriften, Icons und Vorlagen, die ich aus dem Internet heruntergeladen habe) alle Zip-Dateien zur Verfügung gestellt, aber es funktioniert nicht mit einigen Zip-Dateien, hier ist der minimierte Code, um dieses Problem zu regenerieren:

%Vor%

eigentlich In meiner realen Anwendung muss ich Zip-Dateien durch Inputstreams extrahieren. Im obigen Code versuche ich "janne.zip" zu extrahieren. Ich habe diese Datei von Ссылка heruntergeladen extrahiere es mit einem beliebigen Zip-Tool und überraschenderweise auch mit der Methode "unzipFile (String zipName)", aber mit der Methode unzipStream (String zipName)

%Vor%

gibt null zurück

jede Hilfe wäre willkommen

    
spring_dev101 20.03.2013, 11:14
quelle

3 Antworten

13

Keine Antwort darauf, warum diese bestimmte Datei nicht mit java.util.zip funktioniert, aber wenn Sie die Option haben, Ihre Verwendung von java.util.zip.ZipInputStream durch die Apache commons-compress org.apache.commons.compress.archivers.zip.ZipArchiveInputStream (was API-kompatibel sein sollte), dann habe ich das gerade in der Beispieldatei getestet und es scheint erfolgreich zu funktionieren.

>

Allgemein finde ich commons-compress, um viel zuverlässiger als java.util.zip beim Entpacken von Dateien zu sein, die von anderen Tools als den java.util.zip -Klassen selbst erstellt wurden.

Bearbeiten: Ich habe ein bisschen Debugging in Eclipse gemacht und es sieht so aus, als hätte diese spezielle Zip-Datei eine Einzelsegment überspannende Marker von 0x30304b50 vor dem LOC Signatur ( 0x04034b50 ) des lokalen Headers des ersten Eintrags. Dies ist etwas, das commons-compress weiß, wie man mit umgeht, aber java.util.zip nicht - wenn j.u.z.ZipInputStream etwas anderes als eine LOC-Signatur sieht, gibt getNextEntry() % co_de zurück %.

    
Ian Roberts 20.03.2013, 11:48
quelle
4

Lustig!

Ich habe Ihren Code ausgepackt und den gleichen Fehler erhalten. Ich habe eine Header-Überprüfung in der ZipInputStream-Implementierung gefunden, aber nicht in der ZipFile-Implementierung.

Frag mich nicht warum, aber der Header in deiner Zip-Datei ist nicht gültig !

%Vor%

Wenn Sie die ersten Bytes ( 50 4B 30 30 ) aus Ihrer Datei löschen, haben Sie eine gültige Kopfzeile und Sie können Ihre Datei lesen!

    
Mirko 20.03.2013 13:06
quelle
0


Ich hatte das gleiche Problem! Glücklicherweise konnte ich es lösen.
Zuerst setze ich die Blob-Daten in der Datenbank zurück und benutze dann Java-Code, um sie mit ZipInputStream zu komprimieren. Obwohl ich nicht sicher bin, könnte das Null ZipEntry-Problem wegen 2 Dinge sein:
1. Die Blobdaten in der Datenbank werden nicht korrekt gespeichert (oder sie sind bereits komprimiert, einige Datenbanken komprimieren Blobdaten zum Zeitpunkt der Speicherung. Sie können dies auch googeln).
2. Die Eingabe / Ausgabe-Streams können ebenfalls Probleme verursachen, siehe

Hier ist eine detaillierte Beschreibung von dem, was ich getan habe:
1. Setzen Sie das BLOB-Feld in der Datenbank mit EMPTY_BLOB zurück und übernehmen Sie die Änderungen 2. das folgende Java-Programm verwendet, um das Blob-Feld mit einer .xls-Datei zu aktualisieren

%Vor%

Bitte beachten Sie, dass der obige Code funktioniert, aber absolut keine Kodierungsstandards und -praktiken demonstriert.
3. Benutzte die folgende zip-Methode, um Daten zu komprimieren

%Vor%

Die obige Methode nimmt ein Byte-Array, reißt es, steckt es in einen ByteArrayOutputStream. Sie können wählen, ByteArrayOutputStream selbst zu verwenden, aufgrund einiger Anforderungen, die ich in Bytearray umwandeln.
4. Dann füge ich das obige Byte-Array in das Blob-Feld unter Verwendung der vorbereiteten Anweisung | ein 5. Wenn ich den unten angegebenen Entpackungscode verwende, funktioniert es gut!

%Vor%

Die Ausgabe der obigen Methode sind die entpackten Daten.

    
tewari2312 13.05.2016 06:58
quelle

Tags und Links