使用流读取器将文件内容转换为字符串数组,然后进行压缩
本文关键字:数组 字符串 然后 压缩 转换 读取 文件 | 更新日期: 2023-09-27 18:25:01
编辑:我需要将文本文件的内容转换为字符串数组,将它们写入另一个非类型化文件,然后将创建的文件压缩为 gzip。
下面我提供了我能够发现的答案,以及减压过程,如果需要的话。
这是我
用来gziping对象的方法:
byte[] initialBytes = //object serialized to bytes
byte[] compressedBytes;
using (MemoryStream stream = new MemoryStream(initialBytes))
{
using (MemoryStream output = new MemoryStream())
{
using (GZipStream zipper = new GZipStream(output, CompressionMode.Compress))
{
Pump(stream, zipper);
}
compressedBytes = output.ToArray();
}
}
return compressedBytes;
//pump method
internal static void Pump(Stream input, Stream output)
{
byte[] bytes = new byte[4096];
int n;
while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
{
output.Write(bytes, 0, n);
}
}
如果我需要做一个文件:
byte[] result;
using(FileStream file = //some filestream I created)
{
file.Position = 0;
using (MemoryStream output = new MemoryStream())
{
using (GZipStream zipper = new GZipStream(output, CompressionMode.Compress))
{
Pump(file, zipper);
}
result = output.ToArray();
}
}
return result;
.
NET Framework 在基本库中提供了一个System.IO.Compression.DeflateStream
类;它实现了 DEFLATE 压缩算法。 zlib 流只是 zlib 魔术字节,后跟使用 DEFLATE 算法压缩的内容。
哎呀,我给出了"zlib"流的说明,它比 gzip 更原始。 gzip除了压缩的内容外,还有一个目录和其他东西。
对于 gzip,请使用框架的 System.IO.Compression.GZipStream
类,如 Mike_G 的答案所示。
这就是我在这种情况下最终诉诸的。
string jobDirVar = [FilePath];
byte[] bytesToCompress = File.ReadAllBytes(jobDirVar);
byte[] decompressedBytes = new byte[bytesToCompress.Length];
using (FileStream fileToCompress = File.Create(FilePath))
{
using (GZipStream compressionStream = new GZipStream(fileToCompress, CompressionMode.Compress))
{
compressionStream.Write(bytesToCompress, 0, bytesToCompress.Length);
}
}
using (FileStream fileToDecompress = File.Open(FilePath, FileMode.Open))
{
using (GZipStream decompressionStream = new GZipStream(fileToDecompress, CompressionMode.Decompress))
{
decompressionStream.Read(decompressedBytes, 0, bytesToCompress.Length);
}
}
这不是最漂亮的编码,但它似乎为我提供了我所追求的东西。如果其他人有任何可以简化事情的东西,我仍然很想听到它,不过!