Quando usar deflate () de deflateroutputstream?

Dec 23 2020

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

3 rzwitserloot Dec 23 2020 at 21:21

É 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:

  1. pegue bytes (conforme out.write), armazene o quanto for necessário para fazer o trabalho:
  2. ... de compactar esses dados.
  3. 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 seu writemétodo.

O uso básico é:

  1. Crie um recurso, como Files.newOutputStreamou someSocket.getOutputStreamou httpServletResponse.getOutputStream()ou System.outou qualquer outra coisa que produza um fluxo - é um conceito abstrato por uma razão: para tornar as coisas flexíveis.
  2. Envolva esse recurso em um DeflaterOutputStream
  3. 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.
  4. Feche o deflaterstream (que acabará fechando o stream subjacente também).