我正在从磁盘读取解压缩的二进制文件,如下所示:
string fn = @"c:\\MyBinaryFile.DAT";
byte[] ba = File.ReadAllBytes(fn);
MemoryStream msReader = new MemoryStream(ba);
我现在想通过使用压缩的二进制文件来提高I / O的速度。但是我如何将其纳入上述模式?
string fn = @"c:\\MyZippedBinaryFile.GZ";
//Put something here
byte[] ba = File.ReadAllBytes(fn);
//Or here
MemoryStream msReader = new MemoryStream(ba);
实现这一目标的最佳方式是什么。
我需要最终得到一个MemoryStream,因为我的下一步是反序列化它。
答案 0 :(得分:1)
您必须对文件内容使用GZipStream
。
所以基本上它应该是这样的:
string fn = @"c:\\MyZippedBinaryFile.GZ";
byte[] ba = File.ReadAllBytes(fn);
using (MemoryStream msReader = new MemoryStream(ba))
using (GZipStream zipStream = new GZipStream(msReader, CompressionMode.Decompress))
{
// Read from zipStream instead of msReader
}
要考虑flindenberg的有效评论,您还可以直接打开文件,而无需先将整个文件读入内存:
string fn = @"c:\\MyZippedBinaryFile.GZ";
using (FileStream stream = File.OpenRead(fn))
using (GZipStream zipStream = new GZipStream(stream, CompressionMode.Decompress))
{
// Read from zipStream instead of stream
}
你需要最终得到一个内存流?没问题:
string fn = @"c:\\MyZippedBinaryFile.GZ";
using (FileStream stream = File.OpenRead(fn))
using (GZipStream zipStream = new GZipStream(stream, CompressionMode.Decompress))
using (MemoryStream ms = new MemoryStream()
{
zipStream.CopyTo(ms);
ms.Seek(0, SeekOrigin.Begin); // don't forget to rewind the stream!
// Read from ms
}