Extrahieren eine einzelne Datei aus einem remote-Archiv-Datei?
Gegeben
- URL ein Archiv (z.B. zip-Datei)
- Vollständigen Namen (inklusive Pfad) einer Datei in das Archiv
Ich bin auf der Suche nach einer Möglichkeit (vorzugsweise in Java) erstellen Sie eine lokale Kopie der Datei, ohne Download des gesamten Archivs ersten.
Aus meinem (begrenzten) Verständnis sollte es möglich sein, aber ich habe keine Ahnung, wie das geht. Ich habe mit TrueZip, da es scheint, unterstützt eine Vielzahl von Archiv-Typen, aber ich habe Zweifel über seine Fähigkeit zur Arbeit in einer Weise. Hat jemand irgendwelche Erfahrung mit so etwas?
EDIT: zu können, machen das auch mit tar-Archiven und Zip-tarballs ist es für mich auch wichtig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, auf ein minimum, Sie haben zu download die Teil des Archivs bis zu und einschließlich der komprimierten Daten in der Datei, die Sie extrahieren möchten. Das schlägt mit der folgenden Lösung: öffnen Sie eine
URLConnection
zum Archiv, seinen input-stream, wickeln Sie es in einZipInputStream
, und immer wieder rufengetNextEntry()
undcloseEntry()
Iteration durch alle Einträge in der Datei, bis Sie die, die Sie wollen. Dann Lesen Sie Ihre Daten mitZipInputStream.read(...)
.Den Java-code würde wie folgt Aussehen:
Dies ist natürlich ungetestet.
ZipInputStream
? 😉 Wenn man sich auf der ganzen internet, die Sie vielleicht in der Lage zu finden, eineTarInputStream
Sie könnten in etwa den gleichen Weg - wenn nicht, könnten Sie schreiben Ihre eigenen. Es würde einfach sein, da tar-Dateien sind nicht komprimiert, es ist im Grunde nur ein header für jede Datei, gefolgt von der Datei Daten. (Wikipedia hat eine Beschreibung des formats) Für Gzip-tar-Archiv, Java-standard-Bibliothek hat eineGZIPInputStream
können Sie zusammen mit der tar-stream.Im Gegensatz zu den anderen Antworten hier, würde ich mag darauf hinweisen, dass ZIP-Einträge werden einzeln komprimiert, also (in der Theorie) Sie brauchen nicht, etwas herunterzuladen, die mehr als das Verzeichnis und den Eintrag selbst. Der server benötigt zur Unterstützung der
Range
HTTP-header für diese zu arbeiten.Die standard-Java-API unterstützt nur das Lesen von ZIP-Dateien von lokalen Dateien und input-streams. Soweit ich weiß, gibt es keine Bestimmung für das Lesen von random-access-remote-Dateien.
Da Sie mit TrueZip, empfehle ich die Implementierung
de.schlichtherle.io.rof.ReadOnlyFile
Apache-HTTP-Client und erstellen Sie einede.schlichtherle.util.zip.ZipFile
mit, dass.Diese nicht wirklich irgendeinen Vorteil für komprimierte TAR-Archive, da Sie das gesamte Archiv ist komprimiert zusammen (darüber hinaus nur mit einem InputStream und töten Sie es, wenn Sie Ihre Eingabe).
Seit TrueZIP 7.2, es gibt eine neue client-API, die im Modul TrueZIP Weg. Dies ist eine Implementierung des NIO.2 FileSystemProvider für JSE 7. Mit dieser API erhalten Sie Zugriff auf HTTP-URI wie folgt:
Ich bin mir nicht sicher, ob es einen Weg gibt, um ziehen Sie eine einzelne Datei aus einem ZIP ohne Download die ganze Sache zunächst. Aber, wenn du derjenige bist, der das hosting der ZIP-Datei, die Sie erstellen könnte ein Java-servlet liest die ZIP-Datei und gibt die angeforderte Datei in der Antwort: