Wann sollte deflate () von deflateroutputstream verwendet werden?
Ich versuche zu lernen, wie man Deflateroutputstream als etwas benutzt, um die Zeit während meiner Winterpause zu töten. Ich bin verwirrt, denn wenn ich mir die Dokumentation ansehe,https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.htmlEs heißt, dass deflate () verwendet wird, um komprimierte Daten in den Ausgabestream zu schreiben, während write () Daten in den zu komprimierenden deflateroutputstream (komprimierten Ausgabestream) schreibt.
Ich schaue mir jedoch Beispielcodes im Internet an, aber niemand verwendet deflate (). Der gesamte Code, den ich bisher gesehen habe, schreibt einfach () in den deflateroutputstream, ohne deflate () aufzurufen.https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream

Ich habe festgestellt, dass der Code einen Fileoutputstream in den Deflateroutputstream einfügt, aber wie interagiert er? Ruft es automatisch deflate () auf, um komprimierte Daten an fileoutputstream zu senden, wenn Daten in deflateroutputstream geschrieben werden?
Antworten
Es ist protected
: Es ist für alles gedacht, was diesen Stream unterklassifiziert, und Sie unterteilen ihn nicht. Für Sie ist es ein Implementierungsdetail, das Sie nicht in Ihre Argumentation einbeziehen können und das Sie nicht aufrufen können.
Es sei denn, Sie unterteilen es natürlich.
Was Sie könnten - es ist eine Art Toolkit zum Erstellen von LZ-basierten Komprimierungsströmen. Deshalb erweitern sowohl GZipOutputStream als auch ZipOutputStream es: Dies sind verschiedene Container, die mehr oder weniger dieselbe Komprimierungstechnologie verwenden. Und das rufen sie auf deflate
. Dies ist nicht für Sie gedacht, es sei denn, Sie entwickeln ein eigenes LZ-basiertes Komprimierungssystem oder implementieren ein Lesegerät für ein vorhandenes Komprimierungsformat ohne Zip, ohne GZ und ohne Deflater.
Diese Arten von Ausgabestreams werden als "Filterstreams" bezeichnet: Sie stellen selbst keine Ressource dar, sondern umschließen eine. Sie können sich um jedes OutputStream
(oder jedes InputStream
, das Konzept funktioniert sozusagen auf beiden Seiten) drehen und Bytes während der Übertragung ändern.
var out = new DeflaterOutputStream(whatever)
Erstellt einen neuen Deflater-Stream, der alle Daten komprimiert, die Sie an ihn senden (via out.write(stuff)
), und der wiederum die komprimierten Daten aufnimmt und an alle weiterleitet . Es macht den Job von:
- Nehmen Sie Bytes (gemäß
out.write
), puffern Sie so viel, wie für die Arbeit erforderlich ist: - ... diese Daten zu komprimieren.
- Verarbeiten Sie dann die komprimierten Daten, sobald sie komprimiert werden, indem Sie sie an den umschlossenen Ausgabestream senden (
whatever
in diesem Beispiel), indem Sie ihrewrite
Methode aufrufen .
Die grundlegende Verwendung ist:
- Erstellen Sie eine Ressource wie
Files.newOutputStream
odersomeSocket.getOutputStream
oderhttpServletResponse.getOutputStream()
oderSystem.out
oder irgendetwas anderes, das einen Stream erzeugt - es ist ein abstraktes Konzept aus einem Grund: Um die Dinge flexibel zu machen. - Wickeln Sie diese Ressource in eine
DeflaterOutputStream
- Schreiben Sie alle Ihre Daten in den Deflateroutputstream. Vergessen Sie das Original - Sie haben es erstellt, damit Sie es an DeflaterOutputStream übergeben können, und dort endet Ihre Interaktion mit dem zugrunde liegenden Stream.
- Schließen Sie den Deflaterstream (wodurch auch der zugrunde liegende Stream geschlossen wird).