我有一种压缩字节数组的方法。我使用了一个内存流和一个文件流进行测试。来自内存流的结果更大,即使它采用相同的方法,任何人都可以解释原因吗?
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();
}
}
如果我将输出字节数组写入文件,则使用memorystream创建的字节数更大。
答案 0 :(得分:6)
MemoryStream.GetBuffer()
将返回完整的内部缓冲区,该缓冲区可能比数据大。它根据需要调整大小。超过缓冲区容量时,内部缓冲区大小加倍。
如果您需要将MemoryStream
转换为仅包含数据的字节数组,请使用MemoryStream.ToArray()
。它将创建一个足够大小的新数组,并将相关的缓冲区内容复制到其中。
正如MSDN所说:
请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串
"test"
写入MemoryStream
对象,则从GetBuffer
返回的缓冲区长度为256
,而不是4
,{ {1}}字节未使用。要仅获取缓冲区中的数据,请使用252
方法;但是,ToArray
会在内存中创建数据的副本。
当您想要从缓冲区中读取块时,ToArray
函数非常有用,并且您不关心大小是否完全匹配。 GetBuffer
速度较慢,因为它必须在每次调用时复制整个缓冲区内容,而ToArray
只会返回对缓冲区的引用。
例如,如果您使用Stream.Write
等方法,则GetBuffer
会很有用:
GetBuffer
框架中有很多地方有这样的重载,它们需要一个缓冲区但只处理它的一大块。
答案 1 :(得分:1)
MemoryStream在内部使用字节数组。在需要时会加倍。
很可能它有一个未使用字节的TON。