将一个流的内容复制到另一个流的最佳方法是什么?有标准的实用程序方法吗?
从.NET 4.5开始,有Stream.CopyToAsync
方法
input.CopyToAsync(output);
这将返回一个Task
可以在完成时继续进行的操作,如下所示:
await input.CopyToAsync(output)
// Code from here on will be run in a continuation.
请注意,根据调用的位置,后面CopyToAsync
的代码可能会或可能不会在调用它的同一线程上继续。
在SynchronizationContext
调用时被抓获await
将决定线程的延续将上执行。
此外,此调用(这是一个可能会更改的实现细节)仍会按顺序进行读写操作(它不会浪费线程阻塞I / O完成)。
从.NET 4.0开始,有Stream.CopyTo
一种方法
input.CopyTo(output);
对于.NET 3.5及更低版本
框架中没有任何东西可以帮助实现这一点。您必须手动复制内容,如下所示:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write (buffer, 0, read);
}
}
注1:此方法将允许您报告进度(到目前为止已读取x字节...)
注2:为什么使用固定缓冲区大小而不是input.Length
?因为该长度可能不可用!从文档:
如果从Stream派生的类不支持查找,则对Length,SetLength,Position和Seek的调用将引发NotSupportedException。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句