6 Stimmen

Daten an eine Gzip-Datei mit Java anhängen

Ich habe eine Protokolldatei, die möglicherweise riesig ist (>4GB), daher denke ich daran, sie "on the fly zu komprimieren", was bedeutet, dass ich Text direkt am Ende der gzip-Datei einfügen möchte (ich möchte meinen eigenen Dateianschließer für logback erstellen). Ist es möglich, Zeug an eine vorhandene gzip-Datei anzuhängen? Es scheint, dass der einzige Weg ist, die vorhandene Datei mit GZIPInputStream zu öffnen, sie zu lesen und die Daten in eine neue Datei mit GZIPOutputStream zu schreiben und den neuen Inhalt am Ende dieser neuen Datei anzuhängen, dann nehme ich an, die alte gzip zu entfernen und die neue in die alte Datei umzubenennen...

Habe ich unrecht? Bessere Ideen?

Danke!

4voto

Synesso Punkte 35757

Geben Sie true als 2. Argument an den FileOutputStream-Konstruktor, um den Anhänge-Modus zu erhalten.

File f = new File("out.gz");
OutputStream os = new GZIPOutputStream(new FileOutputStream(f, true)); // true for append
PrintWriter w = new PrintWriter(new OutputStreamWriter(os));
w.println("log message");

Bei meinen Beispieldaten wurde dadurch eine bessere Komprimierung als der Standard-Kompressionsstufe von gzip erreicht. (Es war etwas besser als Stufe 7, aber nicht so gut wie Stufe 8).

$ ls -asl out.gz
88 -rw-r--r--  1 jem  staff  41859  5 Jul 07:42 out.gz
$ gunzip out.gz
$ gzip out
$ ls -asl out.gz
88 -rw-r--  1 jem  staff  42164  5 Jul 07:42 out.gz

1 Stimmen

Das funktioniert! Ich denke, das sollte die ausgewählte Antwort sein.

3voto

Mark Adler Punkte 87756

Sie können sich Beispiele ansehen, die in der zlib-Distribution enthalten sind, wie man an gzip-Dateien anhängt und wie man eine wachsende gzip-Datei für Protokolleinträge erstellt. Sie können die zlib-Distribution von zlib.net erhalten und sich Beispiele/gzappend.c, Beispiele/gzlog.c und Beispiele/gzlog.h ansehen. Sie sind in C geschrieben und erfordern möglicherweise zlib-Funktionen, die über die java.util.zip-Schnittstelle zu zlib nicht einfach zu erreichen sind.

Diese Ansätze erfordern keine Neuerstellung einer gzip-Datei.

3voto

Jé Queue Punkte 9947

Das gzip-Format ermöglicht die Verkettung von zuvor gzip-komprimierten Bytestreams, wodurch sie beim Entpacken wie eine einzige Zeichenfolge erscheinen.

Hängen Sie einfach die gzip-Daten am Ende an.

1 Stimmen

Das wäre kein guter Ansatz für kurze Protokolleinträge. Jede gzip-Datei fügt 18 Byte Overhead hinzu, außerdem ist das Komprimieren von kurzen Zeichenfolgen, z. B. einem Protokolleintrag, im Allgemeinen nicht effektiv. Daher wäre es wahrscheinlich besser, einfach eine einfache Protokolldatei zu verwenden. Um von der gzip-Komprimierung zu profitieren, müssten Sie sie in einem einzigen gzip-Stream halten und die Techniken aus den Beispielen anwenden, auf die ich in meiner Antwort verweise.

1voto

Dave Forgac Punkte 2906

Obwohl ich keine javaspezifische Lösung für dieses Problem kenne, gibt es einige native Systemlösungen (vorausgesetzt, Sie nutzen *nix und es spielt keine Rolle, dass es nicht plattformunabhängig ist.) Diese Frage auf Unix / Linux SE bietet einige Ideen dafür (insbesondere komprimierte Loopback-Dateisysteme):

Eine Datei zu einem vorhandenen tar.gz-Archiv hinzufügen/aktualisieren?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X