2 c# compression memorystream filestream deflate
我有一种压缩字节数组的方法.我使用了一个内存流和一个文件流进行测试.来自内存流的结果更大,即使它的方法相同,任何人都可以解释原因吗?
public byte[] DeflateCompress(byte[] data2Compress)
{
using (FileStream _fileToCompress = File.Create("_deflatecompressed.bin"))
{
using (DeflateStream _compressionStream = new DeflateStream(_fileToCompress, CompressionMode.Compress))
{
_compressionStream.Write(data2Compress, 0, data2Compress.Length);
_compressionStream.Close();
}
}
return File.ReadAllBytes("_deflatecompressed.bin");
}
public byte[] DeflateCompress(byte[] data2Compress)
{
using (MemoryStream _memStreamCompress = new MemoryStream())
{
using (DeflateStream _defalteStreamCompress = new DeflateStream(_memStreamCompress, CompressionMode.Compress))
{
_defalteStreamCompress.Write(data2Compress, 0, data2Compress.Length);
_defalteStreamCompress.Close();
}
return _memStreamCompress.GetBuffer();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将输出字节数组写入文件,则使用memorystream创建的字节数更大.
MemoryStream.GetBuffer()将返回完整的内部缓冲区,该缓冲区可能大于数据.它根据需要调整大小.超过缓冲区容量时,内部缓冲区大小加倍.
如果需要将其转换为MemoryStream仅包含数据的字节数组,请使用MemoryStream.ToArray().它将创建一个足够大小的新数组,并将相关的缓冲区内容复制到其中.
正如MSDN所说:
请注意,缓冲区包含可能未使用的已分配字节.例如,如果该字符串
"test"被写入到MemoryStream对象时,缓冲器的长度从返回GetBuffer是256,不4与252字节未使用.要仅获取缓冲区中的数据,请使用该ToArray方法; 但是,ToArray在内存中创建数据的副本.
GetBuffer当您想要从缓冲区中读取块时,该功能非常有用,并且您不关心大小是否完全匹配.ToArray因为它必须在每次调用时复制整个缓冲区内容,所以会更慢,而GetBuffer只会返回对缓冲区的引用.
例如,GetBuffer如果您使用以下方法可能很有用Stream.Write:
public abstract void Write(
byte[] buffer,
int offset,
int count
)
Run Code Online (Sandbox Code Playgroud)
框架中有许多地方有这样的重载,它们需要一个缓冲区但只处理它的一大块.
| 归档时间: |
|
| 查看次数: |
1052 次 |
| 最近记录: |