【问题标题】:Writing a text file into a gz file using GZipStream without first writing the text file to disk使用 GZipStream 将文本文件写入 gz 文件,而无需先将文本文件写入磁盘
【发布时间】:2015-01-07 15:05:22
【问题描述】:

我目前正在从几个数据库查询中生成大量输出。生成的 XML 文件大约为 2GB。 (这是一年的数据)。 为了为客户端节省一些磁盘空间和下载时间,我使用 GZipStream 类将此文件添加到压缩文件中。请参阅下文了解我当前如何将文件压缩为 gz。注意:fi 对象是一个 FileInfo。

using (FileStream inFile = fi.OpenRead())
using (FileStream outFile = File.Create(fi.FullName + ".gz"))
using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress))
{
    byte[] buffer = new byte[65536];
    int numRead;
    while ((numRead = inFile.Read(buffer, 0, buffer.Length)) != 0)
    {
        Compress.Write(buffer, 0, numRead);
    }
}

此方法工作正常,但需要我将 2GB 文本文件写出到磁盘,然后再次将其全部读回,以便将其添加到 GZipStream 中,然后将其作为压缩文件再次写回。这似乎是在浪费时间。

有没有办法将我的 2GB 字符串直接添加到 GZipStream 而无需先写入磁盘?

【问题讨论】:

  • 我不明白你的意思。
  • 我希望能够将我的 2GB 字符串直接写入压缩的 gz 文件中的文本文件中。

标签: c# stream compression gzipstream


【解决方案1】:

您可以从GZipStream 创建一个StreamWriter(或者在您的情况下可能是一个XmlWriter),然后直接写信给它。

using (FileStream outFile = File.Create(fi.FullName + ".gz"))
using (GZipStream compress = new GZipStream(outFile, CompressionMode.Compress))
using (StreamWriter writer = new StreamWriter(compress))
{
    foreach(string line in GetLines())
        writer.WriteLine(line);
}

【讨论】:

    【解决方案2】:

    如果有任何方法可以将数据库结果转换为字符串,然后将其加载到 MemoryStream 中,那应该没问题:

            var databaseResult = "<xml>Very Long Xml String</xml>";
    
            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    writer.Write(databaseResult);
                    writer.Flush();
                    stream.Position = 0;
    
                    using (var outFile = File.Create(@"c:\temp\output.xml.gz"))
                    using (var Compress = new System.IO.Compression.GZipStream(outFile, CompressionMode.Compress))
                    {
                        var buffer = new byte[65536];
                        int numRead;
                        while ((numRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            Compress.Write(buffer, 0, numRead);
                        }
                    }
                }
            }
    

    【讨论】:

    猜你喜欢
    • 2015-03-13
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多