流和压缩

时间:2010-09-30 18:02:03

标签: .net compression stream

像System.IO.Compression.GZipStream这样的东西有什么用呢?像GZip这样的东西在开始编写zip文件之前是不是需要查看整个解压缩文件的内容?

GZipStream在写入任何内容之前是否会缓冲所有内容?如果是这样,那么实现流的意义何在?

3 个答案:

答案 0 :(得分:4)

大多数(如果不是全部)常见压缩算法是流算法,即它们采用可流传输输并产生输出。通常它们以特定大小的块进行处理,有时称为窗口大小,但它们仍然按顺序处理。他们不需要知道任何关于完整流的信息(既不是完整的大小也不是内容)。

某些打包程序会扫描输入文件以确定哪种压缩算法更适用(当支持多种算法时)。例如,如果他们发现输入是文本或包含大文本块,他们可能会选择文本压缩算法。但这不是算法本身的工作方式,而是包装工的工作方式。

答案 1 :(得分:2)

让我试着为你解答一些问题。

压缩是一种压缩大量数据的方法,有效地使其非常小并且易于传输。 退房:http://forums.pcworld.co.nz/archive/index.php/t-22243.html

<强>流: 流只是一种抽象字节序列的方式,以便您可以读取/写入(并且通常在其中寻找)。要将对象转换为流或字节数组,必须将BinaryFormatter(或SoapFormatter)与应用于序列化对象字段的Serializiable和NonSerialized属性一起使用。序列化对象只是将其字段数据写入您选择的任何流(因为System.IO.Stream是基类,您可以写入MemoryStream,FileStream,NetworkStream等)。

仅处理文件的某些部分也很容易。您需要做的就是使用Stream的Seek方法(或Position属性)来读取某些数据块。例如:

byte[] buffer = new byte[4000];

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

这只会将字节1000-5000读入缓冲区,甚至不用查看我认为的文件中的其余数据。

.NET允许您读取文件,整个文件或文件的任何内容。所以知道这一点,GZipStream的工作方式类似。

一些链接:

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

答案 2 :(得分:1)

我建议现在听一下安全episode #205。他们谈论LZW,流和阻止压缩,它可以帮助回答你的很多问题,并帮助解释如何在不知道整个文件的情况下压缩文件。