MemoryStream.WriteTo(Stream destinationStream)与Stream.CopyTo(Stream destinationStream)

Wri*_*ick 8 .net c# memorystream stream

哪一个更好:MemoryStream.WriteTo(Stream destinationStream)或者Stream.CopyTo(Stream destinationStream)??

我正在谈论没有Buffer的这两种方法的比较,因为我这样做:

Stream str = File.Open("SomeFile.file");
MemoryStream mstr = new MemoryStream(File.ReadAllBytes("SomeFile.file"));

using(var Ms = File.Create("NewFile.file", 8 * 1024))
{
    str.CopyTo(Ms) or mstr.WriteTo(Ms);// Which one will be better??
}
Run Code Online (Sandbox Code Playgroud)

更新

这是我想要做的:

  • 打开文件[说"X"类型文件]
  • 解析内容
  • 从这里我得到一堆新的流[3~4个文件]
  • 解析一个流
  • 提取成千上万的文件[流是图像文件]
  • 将其他流保存到文件
  • 编辑所有文件
  • 生成一个新的"X"类型文件.

我写了一些实际工作正常的代码.

但是现在我正在优化代码以提高效率.

Han*_*ant 16

这是一个历史性的事故,有两种方法可以做同样的事情.MemoryStream总是有WriteTo()方法,Stream直到.NET 4才获得CopyTo()方法.

MemoryStream.WriteTo()版本如下所示:

public virtual void WriteTo(Stream stream)
{
    // Exception throwing code elided...
    stream.Write(this._buffer, this._origin, this._length - this._origin);
}
Run Code Online (Sandbox Code Playgroud)

Stream.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)

Stream.CopyTo()更通用,适用于任何流.并帮助程序员摸索从NetworkStream复制数据.忘记关注Read()的返回值是一个非常常见的错误.但它当然会复制字节两次并分配临时buffer,MemoryStream不需要它,因为它可以直接从自己的缓冲区写入.所以你仍然喜欢WriteTo().注意到差异的可能性不大.


Dam*_*ith 6

MemoryStream.WriteTo:将此内存流的全部内容写入另一个流.

Stream.CopyTo:从当前流中读取字节并将其写入目标流.复制从当前流中的当前位置开始.您需要回到0,才能复制整个源流.

所以我认为MemoryStream.WriteTo更适合这种情况


Jon*_*eet 5

如果您使用Stream.CopyTo,则不需要首先将所有字节读入内存。然而:

  • 如果您只使用此代码会更简单File.Copy
  • 如果要将所有数据加载到内存中,您可以使用:

    byte[] data = File.ReadAllBytes("input");
    File.WriteAllBytes("output", data);
    
    Run Code Online (Sandbox Code Playgroud)
  • 您应该有一个using输入和输出流的声明

如果您确实需要处理,因此不能使用File.Copy,则使用Stream.CopyTo将处理比将所有内容加载到内存中更大的文件。当然,您可能不需要这样做,或者您可能因其他原因需要将整个文件加载到内存中。

如果您一个MemoryStream,我可能会使用MemoryStream.WriteTo而不是Stream.CopyTo,但您使用的可能不会有太大区别,除了您需要确保在使用时位于流的开头CopyTo