Quando usar deflate () de deflateroutputstream?
Estou tentando aprender como usar deflateroutputstream como algo para matar o tempo durante minhas férias de inverno. Estou confuso porque quando olho a documentação,https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.html, ele diz que deflate () é usado para gravar dados compactados no outputstream, enquanto write () é para gravar dados no deflateroutputstream (outputstream compactado) para serem compactados.
No entanto, estou procurando códigos de amostra na Internet, mas ninguém usa deflate (). Todo o código que vi até agora é apenas write () para deflateroutputstream sem chamar deflate ().https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream

Percebi que o código coloca um fileoutputstream dentro do deflateroutputstream, mas como ele interage? Ele chama automaticamente deflate () para enviar dados compactados para fileoutputstream quando os dados são gravados para deflateroutputstream?
Respostas
É protected
: Destina-se a qualquer subclasse desse fluxo, e você não o está subclassificando, então, no que lhe diz respeito, é um detalhe de implementação que você não pode incluir em seu raciocínio e que não é para você invocar.
A menos, é claro, que você o subclasse.
O que você poderia - é uma espécie de kit de ferramentas para construir fluxos de compressão baseados em LZ. É por isso que GZipOutputStream e ZipOutputStream o estendem: são contêineres diferentes que usam mais ou menos a mesma tecnologia de compressão. E eles fazem invocar tal deflate
. A menos que você esteja desenvolvendo seu próprio sistema de compressão baseado em LZ ou implementando um leitor para um formato de compressão existente, não zip, não gz e não deflater, isso não é para você.
Esses tipos de fluxos de saída são chamados de 'fluxos de filtros': eles próprios não representam nenhum recurso, eles envolvem um. Eles podem envolver qualquer um OutputStream
(ou qualquer um InputStream
, o conceito funciona em "ambos os lados", por assim dizer) e modificar os bytes em trânsito.
var out = new DeflaterOutputStream(whatever)
cria um novo fluxo deflator que compactará todos os dados que você enviar a ele (via out.write(stuff)
) e, por sua vez, pegará os dados compactados e os enviará para qualquer lugar. Ele faz o trabalho de:
- pegue bytes (conforme
out.write
), armazene o quanto for necessário para fazer o trabalho: - ... de compactar esses dados.
- Em seguida, processe os dados compactados, à medida que eles se tornam compactados, enviando-os para o fluxo de saída empacotado (
whatever
, neste exemplo), chamando seuwrite
método.
O uso básico é:
- Crie um recurso, como
Files.newOutputStream
ousomeSocket.getOutputStream
ouhttpServletResponse.getOutputStream()
ouSystem.out
ou qualquer outra coisa que produza um fluxo - é um conceito abstrato por uma razão: para tornar as coisas flexíveis. - Envolva esse recurso em um
DeflaterOutputStream
- Grave todos os seus dados no deflateroutputstream. Esqueça o original - você o fez para poder passá-lo para DeflaterOutputStream, e é aí que termina sua interação com o fluxo subjacente.
- Feche o deflaterstream (que acabará fechando o stream subjacente também).