Stream.CopyTo和MemoryStream.WriteTo之间的区别

jor*_*hmv 29 c# memorystream httphandler stream

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

_imageProvider.GetImage().CopyTo(context.Response.OutputStream);
Run Code Online (Sandbox Code Playgroud)

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

_imageProvider.GetImage().WriteTo(context.Response.OutputStream);
Run Code Online (Sandbox Code Playgroud)

它工作,浏览器获取图像.那么在MemoryStream类中WriteTo和CopyTo之间的区别是什么,以及StreamGetImage()方法签名中使用class 的推荐方法是什么.

Bro*_*ass 44

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

您很可能在第一个版本中错过了以下内容:

memoryStream.Position = 0;
Run Code Online (Sandbox Code Playgroud)

  • 你在哪里得到这些信息?你能提供链接吗? (6认同)
  • 我希望大脑的神经元具有公共可访问的链接。 (2认同)

Roy*_*mir 12

根据反射器,这是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里看不到任何"遗留机制"......它将所有内容复制this到目的地(缓冲区大小的块).

  • 只是为了保持页面一致:_IternalCopyTo_方法将_Reads_从当前流描述为缓冲区 - 从流的当前位置开始读取(索引和偏移参数是缓冲区中的索引和偏移量) - 即"遗留机制" (6认同)