首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# MemoryStream比FileStream大

C# MemoryStream比FileStream大
EN

Stack Overflow用户
提问于 2014-11-17 15:38:02
回答 2查看 2.4K关注 0票数 2

我有一个压缩字节数组的方法。我用一个内存流和一个filestream进行测试。内存流的结果更大,即使是同样的方法,有人能解释为什么吗?

代码语言:javascript
复制
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();
    }
}

如果我将输出字节数组写入文件,那么用内存流创建的字节数组就会更大。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-17 15:42:39

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

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

正如MSDN所说:

请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串"test"写入MemoryStream对象,则从GetBuffer返回的缓冲区的长度是256,而不是4252字节未使用。若要仅获取缓冲区中的数据,请使用ToArray方法;但是,ToArray会在内存中创建数据的副本。

当您想从缓冲区读取块时,GetBuffer函数非常有用,而且您不关心大小是否完全匹配。ToArray速度较慢,因为它必须在每次调用中复制整个缓冲区内容,而GetBuffer只需返回对缓冲区的引用。

例如,如果使用诸如GetBuffer之类的方法,则可以使用Stream.Write

代码语言:javascript
复制
public abstract void Write(
    byte[] buffer,
    int offset,
    int count
)

框架中有很多地方都有这样的重载,它们需要一个缓冲区,但只处理其中的一部分。

票数 7
EN

Stack Overflow用户

发布于 2014-11-17 15:40:18

MemoryStream在内部使用字节数组。在需要的时候会加倍。

所以很可能它有一吨没有使用的字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26976233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档