关于streamwriters以及压缩如何工作的困惑

时间:2009-02-22 19:49:03

标签: c# .net

在开始之前,是否可以使用编写器编写带有混合内容的.doc文件?例如,我可能有一个带有图像和文本的.doc文件 - 是否适合使用该编写器?我假设一个文本编写者是为了写一个纯文本文件。

我要做的是压缩文件(格式未知),这很容易。但令我困惑的是为什么我会称之为解压缩?这将使尺寸正常且值更大,那么重点是什么?如果我想压缩文件并将其发送到网络驱动器,我应该压缩它,将其复制到网络位置,并将其解压缩到新文件?这个应用程序将是一个Windows服务,所以我需要使用Windows模拟,对吧?

由于

4 个答案:

答案 0 :(得分:3)

我认为你对压缩感到困惑。

您“压缩”任何数据以减小其大小。但是通过减小它的大小,数据的结构也必须改变。

因此,如果您将MS Word文档保存为.doc文件,您将在.doc文件中获得MS Word文档结构。

但是如果你再压缩.doc文件,那么压缩算法的神奇之处就会使文件变小......但不再包含MS Word文档结构。

那么MS Word如何读取它获得的异类结构?它不能!

这就是为什么你必须“解压缩”,以便在压缩之前恢复它拥有的任何数据结构,以便它再次变得有用。

例如,假设您有句子“Woah .NET rocks”,某个压缩算法可能会用英语词典中的页面替换每个单词,而是生成字符串“77 69 84”。

Woah -> 77
.NET -> 69
rocks -> 84

那你怎么理解字符串“77 69 84”?

当然没有意义!因为它已被压缩。

要再次理解它,你必须解压缩它,就像这样:

77 -> Woah
69 -> .NET
84 -> rocks

所以基本上,你正在采用“其他人”的数据结构并压缩它们。在压缩之后,数据对它们没有明显的意义,因为它是压缩形式的。因此,你必须“解压缩”它,以便“其他人”可以再次阅读它。“

我正确理解你的问题?

答案 1 :(得分:1)

Word .doc文件具有非常特定的二进制格式;我不确定StreamWriter是否可以轻松编写一个......

重新压缩...您可以使用GZipStream等内容压缩数据,但这通常用于传输目的;收件人还需要理解解压缩它(例如,TCP客户端/服务器可能同意使用压缩)。使用文件,假设您希望它在另一端“原始”,您需要另一端的服务来解压缩它。

就个人而言,对于本地网络的使用,我不确定它是否值得,除非您正在转移大量数据 - 只需使用robocopy并使用快速网络。

对于互联网使用,大多数协议都内置了压缩支持。带有gzip / deflate的Http是最明显的。

当然,如果你在谈论归档,那么将文件存储在像.zip档案这样的东西中很有意义......当“整体”这样做时,我倾向于在最接近服务器的服务器上运行归档工具。物理磁盘,以最大化IO性能。

答案 2 :(得分:0)

首先,我做了上述帖子,但不是在家时,所以我使用了未注册的帐户。

你已经回答了我的困惑。我实际上知道当你压缩数据时,要再次理解它,你可以解压缩它(比如.zips)。

关于.NET中的压缩问题,当我解压缩数据时,大小值大于原始大小。我有以下代码:

      MemoryStream ms = new MemoryStream();
        // Use the newly created memory stream for the compressed data.
        DeflateStream compressedzipStream = new DeflateStream(ms, CompressionMode.Compress, true);
        Console.WriteLine("Compression");
        compressedzipStream.Write(buffer, 0, buffer.Length);
        // Close the stream.
        compressedzipStream.Close();
        Console.WriteLine("Original size: {0}, Compressed size: {1}", buffer.Length,    ms.Length);

在最后一行(Console.Writeline),我有以下数据:

原稿尺寸:9708,压缩尺寸:13943。压缩尺寸不应该更小吗?我正在使用.jgp文件。

由于

答案 3 :(得分:0)

并非所有数据都是可压缩的。例如,如果您尝试压缩已经压缩的文件(如在jpeg中),则很可能会获得大小。