将FileStream中的数据读入通用Stream

时间:2020-03-06 14:40:58  来源:igfitidea点击:

将流读入另一个流的最有效方法是什么?在这种情况下,我试图将Filestream中的数据读取为通用流。我知道我可以执行以下操作:
1.逐行读取并将数据写入流
2.读取大块字节并写入流
3.等

我只是想找到最有效的方法。

谢谢

解决方案

读取字节缓冲区然后再写入它是最快的。诸如ReadLine()之类的方法需要查找行定界符,这比填充缓冲区要花费更多的时间。

Stephen Toub在其MSDN .NET事务专栏中讨论了流管道。在本文中,他描述了一个CopyStream()方法,该方法将从一个输入流复制到另一个流。这听起来与我们要执行的操作非常相似。

我假设通用流是指任何其他类型的流,例如内存流等。

如果是这样,最有效的方法是读取字节块并将其写入接收者流。块大小可以是512字节左右。

我汇总了一个快速扩展方法(因此仅适用于VS 2008 w / 3.5):

public static class StreamCopier
{
   private const long DefaultStreamChunkSize = 0x1000;

   public static void CopyTo(this Stream from, Stream to)
   {
      if (!from.CanRead || !to.CanWrite)
      {
         return;
      }

      var buffer = from.CanSeek
         ? new byte[from.Length]
         : new byte[DefaultStreamChunkSize];
      int read;

      while ((read = from.Read(buffer, 0, buffer.Length)) > 0)
      {
        to.Write(buffer, 0, read);
      }
   }
}

因此可以使用:

using (var input = File.OpenRead(@"C:\wrnpc12.txt"))
 using (var output = File.OpenWrite(@"C:\wrnpc12.bak"))
 {
    input.CopyTo(output);
 }

我们也可以稍微交换一下逻辑,也可以编写一个CopyFrom()方法。