Zipfile modifizieren in Java

  • Hallo,
    gibt es eine Möglichkeit einen einzelnen ZipEntry in einem ZipFile zu löschen/ersetzen? Ich hab über Google nur einen sehr unbefriedigenden Weg gefunden: Alle anderen ZipEntrys in einen neuen TempFile schreiben bis auf den, den man entfernen/modifizieren will. Damit hätte ich aber bei großen zip Files jedes mal eine irsinnige Kopierzeit.
    mfg Oliver

  • naja in java kann man ja auch konsolencommands absetzen, also das zipprogramm aufrufen. damit könnte es auch anders gehen. Oder gibts eine eigene java zip api?

  • Ja klar, ich beziehe mich auf java.util.zip.* Das Programm soll plattformunabhängig sein. Externe Systeme können außerdem nicht direkt als zip-stream verwendet werden.

  • Hallo,
    gibt es eine Möglichkeit einen einzelnen ZipEntry in einem ZipFile zu löschen/ersetzen? Ich hab über Google nur einen sehr unbefriedigenden Weg gefunden: Alle anderen ZipEntrys in einen neuen TempFile schreiben bis auf den, den man entfernen/modifizieren will. Damit hätte ich aber bei großen zip Files jedes mal eine irsinnige Kopierzeit.
    mfg Oliver

    Es wird aber ohne neuschreiben des ZIPs nicht gehen. Beim Zip-Format liegen ja alle Dateien direkt einzeln Komprimiert nacheinander. Wenn man dazwischen was löscht, müssen also alle anderen Einträge nach vor verschoben werden um ein kompaktes File zu erhalten.

    (Rein theoretisch könnte man ja hintere ZipEntry direkt in die Lücke hineinbasteln. ==> Wird nur gehen wenn man direkt das File byteweise manipuliert. ==> Ist sicher mühsam)

  • Ja, ich dachte, man kann eben einen ZipEntry aus einem Zip entferen, wenn die Entries im File alle sequenziell vorliegen, spricht doch nichts dagegen oder? Wie machen das WinZip/7-Zip ? Die entzippen auch *ALLES* was im Zip und zippen es dann wieder mit der Modifikation? Wenn ich bei einem 500MB Zip eine txt Datei ersetzte? So ein Verhalten wäre mir noch nicht aufgefallen, anderer Seits braucht man sowas seltener.

  • Wenn ich das wirklich programmieren müsste würde ich mal das file mit
    java.io.RandomAccessFile "durchwandern".
    http://java.sun.com/j2se/1.5.0/doc…AccessFile.html

    Im Zipstandard steht sicher, wie ein Header aussieht, und was man stattdessen drüberschreiben kann:
    http://www.pkware.com/documents/casestudies/APPNOTE.TXT

    Programieraufwand schätze ich aber von 10 - ?? Stunden reativ hoch.

  • Hm, ja eben. Wäre schön wenn es in der großen Java Library schon was entsprechendes gäbe. Ich versteh nicht, warum es kein ZipEntry.delete und beim ZipOutputStream kein append gibt. Diese Methoden würde für den Rest ausreichen (altes Element entfernen und neues Element added).
    Ich verstehe in diesem Zusammenhang nicht die Aussage auf
    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4129445
    [quote]
    This is certainly a reasonable request, but...
    - the jar command already offers the functionality from the command line.
    - the jar/zip code is already fragile enough without adding a new dimension
    to the testing matrix.
    - there are easy workarounds.
    [/qoute]

    Welcher "easy workaround" bitte???
    mfg Oliver

  • In den Kommentaren wird https://truezip.dev.java.net/ erwähnt. Ich habe das zwar nicht verwendet, aber schaut das nicht so aus, als ob das das könnte?

  • TrueZip hab ich mir noch nicht angeschaut. Ich will möglichst keinen Fremdcode drinnen haben. Tja echt komisch das eine solche Funktion fehlt. Kann man wohl nix machen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!