Когда использовать deflate () из deflateroutputstream?

Dec 23 2020

Я пытаюсь научиться использовать deflateroutputstream как средство, чтобы убить время во время зимних каникул. Я сбит с толку, потому что когда я смотрю документацию,https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.htmlв нем говорится, что deflate () используется для записи сжатых данных в выходной поток, а write () предназначен для записи данных в deflateroutputstream (сжатый выходной поток) для сжатия.

Тем не менее, я смотрю примеры кодов в Интернете, но никто не использует deflate () вообще. Весь код, который я видел до сих пор, просто пишет () в deflateroutputstream без вызова deflate ().https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream

Я заметил, что код помещает поток fileoutput внутри deflateroutputstream, но как он взаимодействует? Он автоматически вызывает deflate () для отправки сжатых данных в fileoutputstream, когда данные записываются в deflateroutputstream?

Ответы

3 rzwitserloot Dec 23 2020 at 21:21

Это protected: он предназначен для всего, что является подклассом этого потока, и вы не подклассифицируете его, поэтому, насколько вам известно, это деталь реализации, которую вы не можете включить в свои рассуждения и которая не предназначена для вас.

Если, конечно, вы его не подклассифицируете.

Что вы могли бы сделать - это своего рода инструментарий для построения потоков сжатия на основе LZ поверх. Вот почему и GZipOutputStream, и ZipOutputStream расширяют его: это разные контейнеры, которые более или менее используют одну и ту же технологию сжатия. И они действительно ссылаются на это deflate. Если вы не разрабатываете свою собственную систему сжатия на основе LZ или не реализуете считыватель для существующего формата сжатия без zip, без gz и без deflater, это не предназначено для вас.

Эти виды выходных потоков называются «фильтрующими потоками»: они сами по себе не представляют какой-либо ресурс, они охватывают его. Они могут оборачиваться вокруг любого OutputStream(или любого InputStream, так сказать, «с обеих сторон») и изменять байты в пути.

var out = new DeflaterOutputStream(whatever)создает новый поток deflater, который сжимает любые данные, которые вы ему отправляете (через out.write(stuff)), и, в свою очередь, принимает сжатые данные и отправляет их куда угодно. Он выполняет следующие функции:

  1. взять байты (согласно out.write), буферизовать столько, сколько необходимо для выполнения работы:
  2. ... сжатия этих данных.
  3. Затем обработайте сжатые данные по мере их сжатия, отправив их в обернутый выходной поток ( whateverв этом примере), вызвав его writeметод.

Основное использование:

  1. Создайте ресурс, такой как Files.newOutputStreamor someSocket.getOutputStreamor httpServletResponse.getOutputStream()or System.outor что-нибудь еще, что создает поток - это абстрактная концепция по одной причине: сделать вещи гибкими.
  2. Оберните этот ресурс в DeflaterOutputStream
  3. Запишите все свои данные в deflateroutputstream. Забудьте об оригинале - вы сделали его так, чтобы передать его в DeflaterOutputStream, и на этом ваше взаимодействие с базовым потоком заканчивается.
  4. Закройте deflaterstream (что в конечном итоге закроет и базовый поток).