C#MemoryStream大于FileStream

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创建的字节数更大.

Luc*_*ski 6

MemoryStream.GetBuffer()将返回完整的内部缓冲区,该缓冲区可能大于数据.它根据需要调整大小.超过缓冲区容量时,内部缓冲区大小加倍.

如果需要将其转换为MemoryStream仅包含数据的字节数组,请使用MemoryStream.ToArray().它将创建一个足够大小的新数组,并将相关的缓冲区内容复制到其中.

正如MSDN所说:

请注意,缓冲区包含可能未使用的已分配字节.例如,如果该字符串"test"被写入到MemoryStream对象时,缓冲器的长度从返回GetBuffer256,不4252字节未使用.要仅获取缓冲区中的数据,请使用该ToArray方法; 但是,ToArray在内存中创建数据的副本.

GetBuffer当您想要从缓冲区中读取块时,该功能非常有用,并且您不关心大小是否完全匹配.ToArray因为它必须在每次调用时复制整个缓冲区内容,所以会更慢,而GetBuffer只会返回对缓冲区的引用.

例如,GetBuffer如果您使用以下方法可能很有用Stream.Write:

public abstract void Write(
    byte[] buffer,
    int offset,
    int count
)
Run Code Online (Sandbox Code Playgroud)

框架中有许多地方有这样的重载,它们需要一个缓冲区但只处理它的一大块.