Difference between Stream.CopyTo and MemoryStream.WriteTo

爷,独闯天下 提交于 2020-01-23 04:15:11

问题


I have a HttpHandler returning an image through Response.OutputStream. I have the following code:

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

GetImage() method returns a Stream which is actually a MemoryStream instance and it is returning 0 bytes to the browser. If i change GetImage() method signature to return a MemoryStream and use the following line of code:

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

It works and the browser gets an image. So what is the difference between WriteTo and CopyTo in MemoryStream class, and what is the recommended way to make this works using Stream class in GetImage() method signature.


回答1:


WriteTo() is resetting the read position to zero before copying the data - CopyTo() on the other hand will copy whatever data remains after the current position in the stream. That means if you did not reset the position yourself, no data will be read at all.

Most likely you just miss the following in your first version:

memoryStream.Position = 0;



回答2:


According to reflector, this is the CopyTo() method definition:

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);
    }
}

I dont see any "remains mechanism" here... It copies everything from this to destination ( in blocks of buffer size ).



来源:https://stackoverflow.com/questions/10659846/difference-between-stream-copyto-and-memorystream-writeto

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!