小编典典

如何将一个流的内容复制到另一个流?

all

将一个流的内容复制到另一个流的最佳方法是什么?有没有标准的实用方法?


阅读 138

收藏
2022-03-09

共1个答案

小编典典

从 .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。

2022-03-09