如何在.NET 4中实现Stream.CopyTo(Stream)方法?

时间:2009-12-19 18:26:43

标签: .net .net-4.0

.NET 4中引入的一个有用的便利是 Stream.CopyTo(Stream[, Int32]) ,它从当前流中读取内容并将其写入另一个流。

这消除了稍微繁琐code such as this的需要:

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read (buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write (buffer, 0, read);
    }
}

由于我没有在这台机器上安装.NET 4,我想知道是否安装了.NET 4的人可以打开Reflector并向我们展示Framework Class Library团队如何为.NET 4实现此方法。 / p>

将他们的实现与上面的代码片段进行比较和对比。特别是,我很想知道选择了什么默认缓冲区大小。

1 个答案:

答案 0 :(得分:16)

在.NET 4.5.1中,它使用81920字节的固定缓冲区大小。 (.NET的早期版本使用4096字节的固定缓冲区大小,并且它无疑会随着时间的推移而不断变化。)还有一个过载,您可以传递自己的缓冲区大小。

实现与你的实现非常相似,模拟了一些改组和一些错误检查。 Reflector的核心如下:

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

(您现在可以在http://referencesource.microsoft.com/#mscorlib/system/io/stream.cs#98ac7cf3acb04bb1看到实际来源。)

错误检查基本上围绕input.CanRead和output.CanWrite是否为true,或者是否处置。因此,在回答Benny的问题时,应该非常乐意从NetworkStream(或可写的NetworkStream)复制。