Ich möchte einige Daten komprimieren, also stieß ich auf DeflatorInputStream & amp; DeflatorOutputStream-Klassen. Das folgende Beispiel zeigt jedoch, dass ich meine ursprünglichen Daten nicht rekonstruieren kann, wenn ich diese Klassen verwende.
Wenn ich zu ZipInputStream und ZipOutputStream übergehe, funktioniert es zwar, aber da ich keine Zip-Dateien per se brauche, dachte ich, dass eine generische Komprimierung besser wäre. Hauptsächlich interessiert mich, warum dieses Beispiel nicht funktioniert.
%Vor% Historischer Präzedenzfall. Unter Unix wird die Funktion zum Rückgängigmachen einer deflate
als inflate
bezeichnet. Im Gegensatz zu vielen anderen Java IO-Klassen hat das Eingabe- und Ausgabestream-Paar keine (offensichtlich) übereinstimmenden Namen.
DeflaterOutputStream ermöglicht es Ihnen nicht, eine Deflation umzukehren, sondern deflationiert Bytes, wenn sie von einer Senke an eine Quelle übergeben werden. DeflaterInputStream auch wird deflationiert, aber es führt seine Aktion als Datenfluss von der Quelle zur Senke aus.
Um Ihre Daten im unkomprimierten (überhöhten) Format zu lesen, müssen Sie ein InflaterInputStream
:
Da es außerdem möglich ist, nicht alle komprimierten Daten aus dem Stream in einem read
-Aufruf zu erhalten, müssen Sie eine Schleife verwenden. Etwas wie das:
Stellen Sie abschließend sicher, dass Sie den deflaterierten Ausgabestrom vor dem Abrufen der komprimierten Bytes leeren (oder alternativ den Stream schließen).
Es gibt nur zwei kleine Änderungen, die Ihren Code funktionieren lassen.
%Vor%Zuerst müssen Sie den Ausgabestream schließen () . Der Deflator muss einige abschließende Schritte unternehmen, um seine Arbeit abzuschließen.
%Vor%Wenn Sie einen Deflator InputStream verwenden, komprimieren Sie die komprimierten Daten erneut. Ersetzen Sie es durch einen Inflator InputStream und Ihr Code funktioniert einwandfrei.
Tags und Links java compression deflate