Kiedy używać funkcji deflate () funkcji deflateroutputstream?
Próbuję się nauczyć, jak używać deflateroutputstream do zabicia czasu podczas ferii zimowych. Jestem zdezorientowany, bo kiedy patrzę na dokumentację,https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.html, mówi, że deflate () służy do zapisywania skompresowanych danych do outputstream, podczas gdy write () służy do zapisywania danych do deflateroutputstream (skompresowanego strumienia wyjściowego) w celu ich skompresowania.
Patrzę jednak na przykładowe kody w Internecie, ale nikt w ogóle nie używa deflate (). Cały kod, który widziałem do tej pory, po prostu napisz () do deflateroutputstream bez wywoływania deflate ().https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream

Zauważyłem, że kod umieszcza fileoutputstream wewnątrz deflateroutputstream, ale jak to współdziała? Czy automatycznie wywołuje deflate (), aby wysłać skompresowane dane do fileoutputstream, gdy dane są zapisywane do deflateroutputstream?
Odpowiedzi
To jest protected
: jest przeznaczony do czegokolwiek, co stanowi podklasę tego strumienia, a ty go nie podklasujesz, więc jeśli o to chodzi, jest to szczegół implementacyjny, którego nie możesz uwzględnić w swoim rozumowaniu i który nie jest przeznaczony do wywoływania.
Chyba że, oczywiście, podklasujesz to.
Co możesz - to rodzaj zestawu narzędzi do tworzenia strumieni kompresji opartych na LZ na wierzchu. Dlatego rozszerzają go zarówno GZipOutputStream, jak i ZipOutputStream: są to różne kontenery, które w mniejszym lub większym stopniu używają tej samej technologii kompresji. A oni zrobić powołują się na to deflate
. O ile nie opracowujesz własnego systemu kompresji opartego na LZ lub nie wdrażasz czytnika dla istniejącego formatu kompresji nie opartego na zip, gz i deflater, nie jest to przeznaczone dla Ciebie.
Tego rodzaju strumienie wyjściowe nazywane są „strumieniami filtrów”: same nie reprezentują żadnego zasobu, lecz otaczają jeden. Mogą owijać się wokół dowolnego OutputStream
(lub dowolnego InputStream
, koncepcja działa po obu stronach) i modyfikować bajty podczas przesyłania.
var out = new DeflaterOutputStream(whatever)
tworzy nowy strumień deflater, który kompresuje wszystkie dane, które do niego wysyłasz (przez out.write(stuff)
), a następnie pobiera skompresowane dane i wysyła je dalej. Wykonuje zadanie:
- weź bajty (zgodnie z
out.write
), buforuj tyle, ile potrzeba do wykonania zadania: - ... kompresji tych danych.
- Następnie przetwórz skompresowane dane, gdy zostaną skompresowane, wysyłając je do opakowanego strumienia wyjściowego (
whatever
w tym przykładzie), wywołując jegowrite
metodę.
Podstawowe zastosowanie to:
- Utwórz zasób, taki jak
Files.newOutputStream
lubsomeSocket.getOutputStream
lubhttpServletResponse.getOutputStream()
lubSystem.out
cokolwiek innego, co tworzy strumień - to abstrakcyjna koncepcja z jakiegoś powodu: aby uczynić rzeczy elastycznymi. - Zapakuj ten zasób w plik
DeflaterOutputStream
- Zapisz wszystkie swoje dane do deflateroutputstream. Zapomnij o oryginale - stworzyłeś go tak, abyś mógł go przekazać do DeflaterOutputStream i tam kończy się twoja interakcja z podstawowym strumieniem.
- Zamknij strumień deflater (co zakończy również zamknięcie strumienia bazowego).