【问题标题】:Difference between Stream.CopyTo and MemoryStream.WriteToStream.CopyTo 和 MemoryStream.WriteTo 之间的区别
【发布时间】:2012-05-26 10:53:42
【问题描述】:

我有一个通过 Response.OutputStream 返回图像的 HttpHandler。我有以下代码:

_imageProvider.GetImage().CopyTo(context.Response.OutputStream);

GetImage() 方法返回一个 Stream,它实际上是一个 MemoryStream 实例,它向浏览器返回 0 个字节。如果我更改 GetImage() 方法签名以返回 MemoryStream 并使用以下代码行:

_imageProvider.GetImage().WriteTo(context.Response.OutputStream);

它可以工作,并且浏览器会获取图像。那么 MemoryStream 类中的 WriteTo 和 CopyTo 有什么区别,以及在 GetImage() 方法签名中使用 Stream 类的推荐方法是什么。

【问题讨论】:

    标签: c# stream httphandler memorystream


    【解决方案1】:

    WriteTo() 在复制数据之前将读取位置重置为零 - 另一方面,CopyTo() 将复制流中当前位置之后剩余的任何数据。这意味着如果您没有自己重置位置,则根本不会读取任何数据。

    您很可能只是在第一个版本中遗漏了以下内容:

    memoryStream.Position = 0;
    

    【讨论】:

    • 我认为 copyTo 保留了源,而 writeto 没有。
    • 你从哪里得到这些信息的?你能提供链接吗?
    【解决方案2】:

    根据反射器,这是CopyTo()方法定义:

    private void InternalCopyTo(Stream destination, int bufferSize)
    {
        int num;
        byte[] buffer = new byte[bufferSize];
        while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
        {
            destination.Write(buffer, 0, num);
        }
    }
    

    我在这里看不到任何“剩余机制”...它将所有内容从 this 复制到目标(以缓冲区大小的块为单位)。

    【讨论】:

    • 只是为了保持页面一致:IternalCopyTo 方法描述了 Reads 从当前流到缓冲区 - 从流的当前位置开始读取( index 和 offset 参数是缓冲区中的 index 和 offset)——也就是“剩余机制”
    猜你喜欢
    • 2012-05-26
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    • 2012-08-12
    • 2011-02-18
    相关资源
    最近更新 更多