2017-01-25 2 views
0

Ich erhalte von einem Webservice XML-Dateien im Gzip-Format komprimiert. Die ursprüngliche Größe der Xmls beträgt etwa 80 MB, und die komprimierte Version ist etwa 10 MB. Diese XML-Dateien werden in unserem Cache gespeichert.Inhalt in einer gzip-Datei ersetzen, ohne es zu entpacken

Der XML-Stamm enthält ein Attribut, das eine achtstellige eindeutige ID darstellt. Wenn wir also eine Antwort aus dem Cache liefern, müssen wir diese ID durch eine andere ändern, die von einem anderen Webservice empfangen wurde, bevor die XML an den Endbenutzer zurückgegeben wird.

So sollte der Prozess sein:

  1. den Cache xml dekomprimieren.
  2. Ersetzen Sie die zwischengespeicherte ID durch eine, die Sie von einem Webservice erhalten haben.
  3. Komprimieren Sie die Datei erneut und geben Sie sie an den Client zurück.

Dies ist eine Java-Software. Ich habe mich gefragt, ob es eine Möglichkeit gibt, diese Ersetzung durchzuführen, ohne das gesamte Dokument zu dekomprimieren und erneut zu komprimieren. Irgendeine Art von Lesen und Schreiben ... Ich weiß es nicht.

Ich habe nach einer Java-Bibliothek gesucht, die das tun könnte, aber ich finde nichts (vielleicht, weil es nicht möglich ist).

Irgendeine Idee? Vielen Dank.

+0

Können Sie den Code anzeigen, in dem Sie dekomprimieren, ersetzen und dann erneut komprimieren? Es kann Raum für Verbesserungen geben –

+0

Noch nicht codiert, aber die Idee ist: 1. Erstellen Sie ein Byte [] mit dem unkomprimierten Dokument (mit gzipinputstream). 2. Ersetzen Sie das achtstellige Byte byte (vermeiden Sie eine temporäre Kopie). 3. Komprimiere dieses Byte [] mit gzipoutputstream. – JBalaguero

Antwort

0

Nein. Sie müssten es dekomprimieren, um herauszufinden, wo und wie die ID codiert ist. Dann kannst du entweder a) wirklich schlau sein und herausfinden, wie man einen Stream mit einer anderen ID, aber mit der gleichen Anzahl von Bits unter Verwendung der aktuell definierten Codetabellen wieder zusammensetzt, im Wesentlichen ein Puzzle löst (vorausgesetzt, dass es überhaupt gelöst werden kann), oder b) komprimiere das Ganze mit der neuen ID.

Wenn Sie die Komprimierung Ihres Startpunkts kontrollieren, können Sie den Stream speziell dafür vorbereiten, indem Sie direkt vor der ID auf Komprimierung umschalten, den Block leeren, einen gespeicherten Block direkt hinter der ID und dann Weiter mit der Komprimierung. Sie könnten feststellen, wo im Ausgabestrom das ist. Dann könnten Sie später die ID ersetzen, die im Stream als diese Bytes direkt angezeigt wird. Sie müssten auch die CRC aktualisieren, für die Sie exklusiv oder die ursprüngliche CRC mit einem "rohen" CRC der exklusiven oder der alten unkomprimierten Daten und der neuen unkomprimierten Daten aktualisieren können. Das ist nur die Exklusiv-oder der alten ID und die ID, mit einer Reihe von Nullen vor und nach dem, um die Datenlänge zu füllen. Ein "roher" CRC ist einer, in dem das CRC-Register mit Nullen initialisiert wird und für den es kein abschließendes Exklusiv-Oder gibt.

Verwandte Themen