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

标签 .net .net-4.0

.aa 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并向我们展示框架类库团队如何为.NET 4实现此方法。

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

最佳答案

在.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)复制应该会非常高兴。

关于.net - .NET 4中如何实现Stream.CopyTo(Stream)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1933742/

相关文章:

c# - UTF8Encoding.UTF8.GetBytes 和 Encoding.UTF8.GetBytes 之间有什么区别吗?

javascript - 从 javascript 调用 Webform 身份验证页面后面的 .net Web 服务

c# - 数组在.NET4.0中共享内存-反射或StructLayout可以实现吗?

c#-4.0 - Log4net 在 Debug 中工作,但在 Release 构建中失败

.net-4.0 - 无法在 MonoDevelop 2.4.1 中添加 .NET 4.0 程序集引用

c# - 如何制作只接受数字的文本框?

c# - .NET 模拟 Ctrl+Alt+Del 发送键

c# - 命名一个简单的依赖注入(inject)框架

visual-studio-2010 - 无法将 Firebird DDEX .NET 提供程序集成与 Visual Studio 2010 配合使用

c# - 枚举加法与减法和类型转换