Quand utiliser deflate () de deflateroutputstream?

Dec 23 2020

J'essaye d'apprendre à utiliser le déflateroutputstream comme quelque chose pour tuer le temps pendant mes vacances d'hiver. Je suis confus parce que quand je regarde la documentation,https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.html, il dit que deflate () est utilisé pour écrire des données compressées dans le flux de sortie, tandis que write () consiste à écrire des données dans le flux de sortie de déflater (flux de sortie compressé) à compresser.

Cependant, je regarde des exemples de codes sur Internet, mais personne n'utilise du tout deflate (). Tout le code que j'ai vu jusqu'à présent, écrivez simplement () dans le flux de sortie deflater sans appeler deflate ().https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream

J'ai remarqué que le code place un fileoutputstream dans le deflateroutputstream, mais comment interagit-il? Appelle-t-il automatiquement deflate () pour envoyer des données compressées au fileoutputstream lorsque les données sont écrites dans deflateroutputstream?

Réponses

3 rzwitserloot Dec 23 2020 at 21:21

C'est protected: il est destiné à tout ce qui sous-classe ce flux, et vous ne le sous-classez pas, donc en ce qui vous concerne, c'est un détail d'implémentation que vous ne pouvez pas inclure dans votre raisonnement et qui n'est pas destiné à être invoqué.

À moins, bien sûr, que vous le sous-classiez.

Ce que vous pourriez - c'est une sorte de boîte à outils pour créer des flux de compression basés sur LZ par-dessus. C'est pourquoi GZipOutputStream et ZipOutputStream l'étendent: ce sont des conteneurs différents qui utilisent plus ou moins la même technologie de compression. Et ils le font Invoke que deflate. À moins que vous ne développiez votre propre système de compression basé sur LZ ou que vous implémentiez un lecteur pour un format de compression existant, non-zip, non-gz, non-deflater, ceci n'est pas fait pour vous.

Ces types de flux de sortie sont appelés «flux de filtres»: ils ne représentent en eux-mêmes aucune ressource, ils en entourent une. Ils peuvent envelopper n'importe lequel OutputStream(ou n'importe lequel InputStream, le concept fonctionne des «deux côtés» pour ainsi dire) et modifier les octets en transit.

var out = new DeflaterOutputStream(whatever)crée un nouveau flux de déflater qui compressera toutes les données que vous lui enverrez (via out.write(stuff)), et il prendra à son tour les données compressées et les enverra à n'importe quoi. Il fait le travail de:

  1. prenez des octets (comme par out.write), tamponnez autant que nécessaire pour faire le travail:
  2. ... de compresser ces données.
  3. Traitez ensuite les données compressées, lorsqu'elles sont compressées, en les envoyant au flux de sortie encapsulé ( whatever, dans cet exemple), en appelant sa writeméthode.

L'utilisation de base est:

  1. Créez une ressource, telle que Files.newOutputStreamou someSocket.getOutputStreamou httpServletResponse.getOutputStream()ou System.outou toute autre chose qui produit un flux - c'est un concept abstrait pour une raison: rendre les choses flexibles.
  2. Enveloppez cette ressource dans un DeflaterOutputStream
  3. Écrivez toutes vos données dans le flux de sortie du déflateur. Oubliez l'original - vous l'avez fait pour pouvoir le transmettre à DeflaterOutputStream, et c'est là que votre interaction avec le flux sous-jacent se termine.
  4. Fermez le deflaterstream (ce qui finira également par fermer le flux sous-jacent).