.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>
将他们的实现与上面的代码片段进行比较和对比。特别是,我很想知道选择了什么默认缓冲区大小。
答案 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)复制。