使用 GZipStream 将文本文件写入 gz 文件,而无需先将文本文件写入磁盘
Writing a text file into a gz file using GZipStream without first writing the text file to disk
我目前正在从一些数据库查询中生成大量输出。生成的 XML 文件大约为 2GB。 (这是一年的数据)。
为了节省一些磁盘 space 和客户端的下载时间,我使用 GZipStream class 将此文件添加到压缩文件中。请参阅下文了解我目前如何将文件压缩为 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 而无需先写入磁盘?
如果有任何方法可以将数据库结果转换为字符串,然后将其加载到 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);
}
}
}
}
您可以从 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);
}
我目前正在从一些数据库查询中生成大量输出。生成的 XML 文件大约为 2GB。 (这是一年的数据)。 为了节省一些磁盘 space 和客户端的下载时间,我使用 GZipStream class 将此文件添加到压缩文件中。请参阅下文了解我目前如何将文件压缩为 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 而无需先写入磁盘?
如果有任何方法可以将数据库结果转换为字符串,然后将其加载到 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);
}
}
}
}
您可以从 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);
}