.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/