【发布时间】:2011-04-19 12:09:17
【问题描述】:
像 System.IO.Compression.GZipStream 这样的东西有什么工作机会?像 GZip 这样的东西在开始写入 zip 文件之前不需要查看整个解压缩文件的内容吗?
GZipStream 在写入之前是否会缓冲所有内容?如果是这样,实现流的意义何在?
【问题讨论】:
标签: .net compression stream
像 System.IO.Compression.GZipStream 这样的东西有什么工作机会?像 GZip 这样的东西在开始写入 zip 文件之前不需要查看整个解压缩文件的内容吗?
GZipStream 在写入之前是否会缓冲所有内容?如果是这样,实现流的意义何在?
【问题讨论】:
标签: .net compression stream
大多数(如果不是全部)常见的压缩算法都是流算法,即它们采用流式输入并产生输出。通常它们以一定大小的块进行处理,有时称为窗口大小,但它们仍然按顺序进行处理。他们不需要了解有关完整流的任何信息(无论是完整大小还是内容)。
一些打包程序会扫描输入文件以确定哪种压缩算法更适用(当支持多种算法时)。例如,如果他们发现输入是文本或包含大文本块,他们可能会选择文本压缩算法。但这不是算法本身的工作方式,而是打包程序的工作方式。
【讨论】:
好吧,让我试着为你回答一些问题。
压缩是一种压缩大量数据的方法,有效地使其非常小且易于传输。 签出: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/
【讨论】:
我建议现在收听安全的episode #205。他们谈论 LZW,以及流和块压缩,它可能有助于回答您的许多问题并帮助解释如何在不知道整个文件的情况下压缩文件。
【讨论】: