dateien in einer zip datei hinzufügen - Archiv updaten

Status
Nicht offen für weitere Antworten.

mr.deaht

Mitglied
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.
 
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.
 
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
 
java.util.jar.JarInputStream erbt von java.util.zip.ZipInputStream.
In dieseer Klasse gibts eine Methode
Code:
public long skip(long n)
die
API-Doc der Klasse ZipInputStream hat gesagt.:
Skips specified number of bytes in the current ZIP entry.
 
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??
 
Es besteht die Möglichkeit dem Konstruktor FileOutputStream die Anweisung des Anhängens zu übergeben:

Code:
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.
 
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
 
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..
 
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
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben