Когда использовать deflate () из deflateroutputstream?
Я пытаюсь научиться использовать 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?
Ответы
Это protected
: он предназначен для всего, что является подклассом этого потока, и вы не подклассифицируете его, поэтому, насколько вам известно, это деталь реализации, которую вы не можете включить в свои рассуждения и которая не предназначена для вас.
Если, конечно, вы его не подклассифицируете.
Что вы могли бы сделать - это своего рода инструментарий для построения потоков сжатия на основе LZ поверх. Вот почему и GZipOutputStream, и ZipOutputStream расширяют его: это разные контейнеры, которые более или менее используют одну и ту же технологию сжатия. И они действительно ссылаются на это deflate
. Если вы не разрабатываете свою собственную систему сжатия на основе LZ или не реализуете считыватель для существующего формата сжатия без zip, без gz и без deflater, это не предназначено для вас.
Эти виды выходных потоков называются «фильтрующими потоками»: они сами по себе не представляют какой-либо ресурс, они охватывают его. Они могут оборачиваться вокруг любого OutputStream
(или любого InputStream
, так сказать, «с обеих сторон») и изменять байты в пути.
var out = new DeflaterOutputStream(whatever)
создает новый поток deflater, который сжимает любые данные, которые вы ему отправляете (через out.write(stuff)
), и, в свою очередь, принимает сжатые данные и отправляет их куда угодно. Он выполняет следующие функции:
- взять байты (согласно
out.write
), буферизовать столько, сколько необходимо для выполнения работы: - ... сжатия этих данных.
- Затем обработайте сжатые данные по мере их сжатия, отправив их в обернутый выходной поток (
whatever
в этом примере), вызвав егоwrite
метод.
Основное использование:
- Создайте ресурс, такой как
Files.newOutputStream
orsomeSocket.getOutputStream
orhttpServletResponse.getOutputStream()
orSystem.out
or что-нибудь еще, что создает поток - это абстрактная концепция по одной причине: сделать вещи гибкими. - Оберните этот ресурс в
DeflaterOutputStream
- Запишите все свои данные в deflateroutputstream. Забудьте об оригинале - вы сделали его так, чтобы передать его в DeflaterOutputStream, и на этом ваше взаимодействие с базовым потоком заканчивается.
- Закройте deflaterstream (что в конечном итоге закроет и базовый поток).