C#MemoryStream大于FileStream

时间:2014-11-17 15:38:02

标签: c# compression filestream memorystream 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();
    }
}

如果我将输出字节数组写入文件,则使用memorystream创建的字节数更大。

2 个答案:

答案 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。