我有一个压缩字节数组的方法。我用一个内存流和一个filestream进行测试。内存流的结果更大,即使是同样的方法,有人能解释为什么吗?
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();
}
}如果我将输出字节数组写入文件,那么用内存流创建的字节数组就会更大。
发布于 2014-11-17 15:42:39
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
)框架中有很多地方都有这样的重载,它们需要一个缓冲区,但只处理其中的一部分。
发布于 2014-11-17 15:40:18
MemoryStream在内部使用字节数组。在需要的时候会加倍。
所以很可能它有一吨没有使用的字节。
https://stackoverflow.com/questions/26976233
复制相似问题