2010-09-30 23 views
2

Comment fonctionne quelque chose comme System.IO.Compression.GZipStream? Quelque chose comme GZip n'a pas besoin de regarder le contenu d'un fichier décompressé entier avant de pouvoir commencer à écrire le fichier zip?Streams et Compression

Est-ce que GZipStream met tout en mémoire tampon avant d'écrire quoi que ce soit? Si oui, quel est le point de mise en œuvre du flux?

Répondre

4

La plupart (sinon la totalité) des algorithmes de compression courants sont des algorithmes de flux, c'est-à-dire qu'ils prennent une entrée pouvant être écoutée et produisent une sortie. Habituellement, ils effectuent des traitements dans des blocs d'une certaine taille, parfois appelés fenêtres de taille, mais ils font quand même un traitement séquentiel. Ils n'ont pas besoin de savoir quoi que ce soit sur le flux complet (ni sa taille ni son contenu).

Certains packers analysent les fichiers d'entrée afin de déterminer quel algorithme de compression serait le plus applicable (lorsque plusieurs algorithmes sont supportés). Par exemple, ils peuvent choisir des algorithmes de compression de texte s'ils trouvent que l'entrée est du texte ou contiennent de gros blocs de texte. Mais ce n'est pas comme ça que l'algorithme fonctionne, c'est comme ça que fonctionne l'emballeur.

2

Eh bien, laissez-moi essayer de répondre à certaines de ces questions pour vous. Le zipping est un moyen de compresser un paquet de données, ce qui le rend très petit et facile à transférer. départ: http://forums.pcworld.co.nz/archive/index.php/t-22243.html

cours d'eau: cours d'eau sont juste une façon d'abstraire une séquence d'octets de sorte que vous pouvez lire/écrire (et chercher habituellement dans) les. Pour transformer un objet en un tableau de flux ou d'octets, vous devez utiliser BinaryFormatter (ou SoapFormatter) avec les attributs Serializiable et NonSerialized appliqués aux champs d'objets que vous sérialisez. La sérialisation d'un objet écrit simplement ses données de champ dans n'importe quel flux de votre choix (puisque System.IO.Stream est la classe de base, vous pouvez écrire dans un MemoryStream, FileStream, NetworkStream, etc.)

Traiter uniquement avec des portions de le fichier est assez facile aussi. Tout ce que vous devez faire est d'utiliser la méthode Seek d'un Stream (ou la propriété Position) pour lire certains morceaux de données. Par exemple:

byte[] buffer = new byte[4000]; 

myStream.Position = 1000; 
myStream.Read(buffer, 0, buffer.Length); 

Cela ne lire des octets 1000-5000 dans la mémoire tampon, sans même regarder le reste des données dans le fichier, je crois.

.NET vous permet de lire un fichier, le fichier entier ou rien d'un fichier. Donc, sachant cela, le GZipStream fonctionnera de manière similaire.

Quelques liens pour vous:

http://www.geekpedia.com/tutorial190_Zipping-files-using-GZipStream.html

http://www.csharphacker.com/technicalblog/index.php/2009/07/27/gzipstream-helper-gzip/

http://dotnetperls.com/gzipstream

1

Je recommande l'écoute de episode #205 de sécurité maintenant. Ils parlent de LZW, et diffusent et bloquent les compressions, cela peut aider à répondre à beaucoup de vos questions et vous aider à expliquer comment vous pouvez compresser un fichier sans connaître le fichier entier.