# dateien in einer zip datei hinzufügen - Archiv updaten



## mr.deaht (22. Okt 2005)

Hi,
ich will in java ein entpackprogramm schreiben für zip dateien.
Das einlesen und schreiben von ganzen Dateien durch ZipInputStream und ZipOutputStream funktioniert.
Das einzige problem ist wenn ich jetzt dateien in einer vohandenen zip datei hinzufügen will, muss ich jedesmal die vorhandene datei auslesen und neu schreiben. Gibt es eine möglichkeit die Datei nur hinzuzufügen ohne die vorhandenen neu zu schreiben? Die methode des neu schreiben brauch halt bei großen Dateien ewig. hoffe ihr könnt mir helfen.


----------



## MPW (24. Okt 2005)

wie genau stellst du denn das anlegen an?

Hast du dir klassen geschrieben, benutzt du eine Art Zip Api oder nimmst du die jar klassen, die ja ähnlich dem Zipformat sind?

Egal welche Methode du nimmst, da wird's doch wohl eine Updatemethode geben wie -u bei jar.


----------



## mr.deaht (29. Okt 2005)

ich benutze die ganz normale java.util.jar.* mit den Classen JarInputStream JarOutputStreamStream. Leider konnte ich da keine funktion finden in dem ich bytes überspringen kann oder was hinzuzufügen kann. Kennt da einer eine lösung


----------



## L-ectron-X (29. Okt 2005)

java.util.jar.JarInputStream erbt von java.util.zip.ZipInputStream.
In dieseer Klasse gibts eine Methode

```
public long skip(long n)
```
die


			
				API-Doc der Klasse ZipInputStream hat gesagt.:
			
		

> Skips specified number of bytes in the current ZIP entry.


----------



## mr.deaht (29. Okt 2005)

Das mit dem input stream hab ich auch schon gefunden. Aber wie mache ich es beim outputStream. Gibt es da irgendeine methode damit ich nicht nochmal alles neu schreiben muss??


----------



## L-ectron-X (29. Okt 2005)

Vielleicht bekommst du das mit putNextEntry() hin.


----------



## mr.deaht (30. Okt 2005)

Wenn ich putNextEntry() benutze wird die alte datei überschrieben. Hab ich auch schon ausprobiert.


----------



## Dominicana (14. Feb 2006)

Es besteht die Möglichkeit dem Konstruktor *FileOutputStream* die Anweisung des Anhängens zu übergeben:


```
zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile,true));
```

Ohne *true* am Ende wird die Datei *zipFile* einfach überschrieben, so aber wird die nächste Datei einfach angefügt.

Dom.


----------



## TheSunToucher (15. Mrz 2006)

Ich war mir eigentlich relativ sicher das es nicht geht, jedenfalls habe ich viele Threads zum Thema gefunden und überall hieß es man müßte mit einer temporären Zip-Datei arbeiten und die Einträge hin und her kopieren... Kannst du vieleicht ein Beispiel posten, denn bei meinem Versuchen mit "append true" habe ich folgende Fehlermeldung erhalten:

Unexpected end of archive


----------



## jelzi (24. Apr 2006)

Hat jemand eine Lösung dafür ?
Ich schreibe eine Anwendug für PDAs.. Kann nicht das ganze Archiv neu komprimieren bei Änderungen.
Das würde zu lange dauern..


----------



## Kian (25. Apr 2006)

www.javaworld.com/javaworld/jw-10-2000/jw-1027-toolbox.html


----------



## TheSunToucher (25. Apr 2006)

Ich hab mir mittlerweile auch eine kleine Util-Klasse gebaut, die ungefähr das gleiche macht. Hier die wichtigsten Methoden:

addToZipfile(List srcFiles, File destFile, File absolutePathPrefix)
fügt einer bestehenden Zip-Datei weitere Einträge bzw. Dateien hinzu
createZipfile(List srcFiles, File destFile, File absolutePathPrefix)
erstellt eine Zip-File
extractZipfile(File srcFile, File destDir)
packt eine Zip-File in das angegebene Verzeichnis aus
Natürlich kann man sich noch ein paar andere Methoden bzw. Methoden-Signaturen ausdenken, beispielsweise ein File[] statt einer Liste, aber diese Klasse nutze ich momentan in einem Projekt. Falls jemand interesse hat kann ich sie (aufräumen und) irgendwo hochladen.

Ich habe mir auch Apache Commons Compress angeschaut (klick) und dachte das würde solche Methoden bieten, doch dem ist nicht so. Es ist lediglich ein reimplementation des java.util.zip-Packets plus weitere Algoritmen. Außerdem noch im Sandboxstatus...

Gruß
Tim


----------

