Kiedy używać funkcji deflate () funkcji deflateroutputstream?

Dec 23 2020

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

3 rzwitserloot Dec 23 2020 at 21:21

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:

  1. weź bajty (zgodnie z out.write), buforuj tyle, ile potrzeba do wykonania zadania:
  2. ... kompresji tych danych.
  3. Następnie przetwórz skompresowane dane, gdy zostaną skompresowane, wysyłając je do opakowanego strumienia wyjściowego ( whateverw tym przykładzie), wywołując jego writemetodę.

Podstawowe zastosowanie to:

  1. Utwórz zasób, taki jak Files.newOutputStreamlub someSocket.getOutputStreamlub httpServletResponse.getOutputStream()lub System.outcokolwiek innego, co tworzy strumień - to abstrakcyjna koncepcja z jakiegoś powodu: aby uczynić rzeczy elastycznymi.
  2. Zapakuj ten zasób w plik DeflaterOutputStream
  3. 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.
  4. Zamknij strumień deflater (co zakończy również zamknięcie strumienia bazowego).