Discussion:
ZipOutputStream korrekt verwenden
(zu alt für eine Antwort)
Christoph Schneegans
2015-12-01 22:10:19 UTC
Permalink
Hallo allerseits!

Ich möchte mit java.util.zip.ZipOutputStream ein .zip-Archiv erstellen.
Leider ist die Dokumentation der Klasse recht dürftig. Mir ist nun
insbesondere unklar, wie Unterverzeichnisse im Archiv korrekt behandelt
werden müssen.

Ich gehe davon aus, daß ich etwa mit

ZipOutputStream zip = ...
ZipEntry entry = new ZipEntry("dir/");
zip.putNextEntry(entry);
zip.closeEntry();

einen Unterverzeichnis-Eintrag und mit

ZipOutputStream zip = ...
ZipEntry entry = new ZipEntry("dir/file.txt");
zip.putNextEntry(entry);
zip.write("abcdef".getBytes());
zip.closeEntry();

einen Datei-Eintrag erstelle.

Gibt es denn überhaupt eine technische Notwendigkeit,
Unterverzeichnis-Einträge explizit zu erstellen? ZipOutputStream hindert
mich ja nicht daran, _nur_

ZipEntry entry = new ZipEntry("dir/file.txt");

aufzurufen. Die resultierende .zip-Datei hat dann nur einen Eintrag, und
dennoch kann man sie etwa in 7-Zip tadellos öffnen und dort in ein
Verzeichnis "dir" wechseln.

Spielt die Reihenfolge ansonsten eine Rolle? Wäre etwa

ZipEntry entry = new ZipEntry("dir/foo.txt");
...
ZipEntry entry = new ZipEntry("dir/");
...
ZipEntry entry = new ZipEntry("dir/bar.txt");
...

fehlerhaft?
--
<http://schneegans.de/lv/> · Validator für BCP 47
Stefan Ram
2015-12-02 13:20:23 UTC
Permalink
Post by Christoph Schneegans
Gibt es denn überhaupt eine technische Notwendigkeit,
Unterverzeichnis-Einträge explizit zu erstellen?
Ich kenne mich mit Zip-Dateien und mit diesem Teil der
Standardbibliothek von Java SE nicht aus, vermute aber,
daß man Laufzeitfehler, die dabei auftreten, so genauer
diesem Schritt zuordnen kann.
Stefan Ram
2015-12-02 13:22:58 UTC
Permalink
[Wegen eines Fehlers in einer Kopfzeile hier
sicherheitshalber ein Repost als Supersedes.]
Post by Christoph Schneegans
Gibt es denn überhaupt eine technische Notwendigkeit,
Unterverzeichnis-Einträge explizit zu erstellen?
Ich kenne mich mit Zip-Dateien und mit diesem Teil der
Standardbibliothek von Java SE nicht aus, vermute aber,
daß man Laufzeitfehler, die dabei auftreten, so genauer
diesem Schritt zuordnen kann.
Stefan Ram
2015-12-02 13:34:58 UTC
Permalink
Post by Stefan Ram
[Wegen eines Fehlers in einer Kopfzeile hier
sicherheitshalber ein Repost als Supersedes.]
Post by Christoph Schneegans
Gibt es denn überhaupt eine technische Notwendigkeit,
Unterverzeichnis-Einträge explizit zu erstellen?
Ich kenne mich mit Zip-Dateien und mit diesem Teil der
Standardbibliothek von Java SE nicht aus, vermute aber,
daß man Laufzeitfehler, die dabei auftreten, so genauer
diesem Schritt zuordnen kann.
Und außerdem wäre es bei einer automatischen Rekursion auf
diese Weise sichergestellt, daß auch leere Verzeichnisse
angelegt werden.
Christoph Schneegans
2015-12-07 14:03:32 UTC
Permalink
Post by Stefan Ram
Ich kenne mich mit Zip-Dateien und mit diesem Teil der
Standardbibliothek von Java SE nicht aus, vermute aber, daß man
Laufzeitfehler, die dabei auftreten, so genauer diesem Schritt
zuordnen kann.
Und außerdem wäre es bei einer automatischen Rekursion auf diese
Weise sichergestellt, daß auch leere Verzeichnisse angelegt werden.
Ist beides im konkreten Fall kein ernsthaftes Problem.

Die bislang fehlenden Verzeichnis-Einträge kann ich trivial erzeugen,
und das werde ich in Zukunft auch so handhaben.

Eine "konsistente" Reihenfolge könnte ich hingegen nur umständlich
garantieren. In einem von Maven gebauten .ear sehe ich nun etwa folgende
Reihenfolge:

META-INF/
META-INF/MANIFEST.MF
lib/
META-INF/application.xml
lib/commons-io-2.4.jar

Das ist ja ebenfalls "schief". Ich gehe deshalb davon aus, daß das
vielleicht nicht schön, aber jedenfalls erlaubt ist.
--
<http://schneegans.de/lv/> · Validator für BCP 47
Claus Reibenstein
2015-12-02 20:00:49 UTC
Permalink
Post by Christoph Schneegans
Gibt es denn überhaupt eine technische Notwendigkeit,
Unterverzeichnis-Einträge explizit zu erstellen?
Wenn Du die Attribute mitsichern willst, wirst Du wohl nicht umhin
kommen. Ansonsten ... keine Ahnung. Einfach mal ausprobieren und
schauen, was passiert.

Gruß
Claus
Lesen Sie weiter auf narkive:
Loading...