5

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

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

谢谢

4

4 回答 4

7

Stephen Toub 在他的 MSDN .NET 问题专栏中讨论了流管道。在文章中,他描述了从一个输入流复制到另一个流的 CopyStream() 方法。这听起来与您尝试做的非常相似。

于 2008-09-24T19:10:13.940 回答
7

我汇总了一种快速扩展方法(仅适用于 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()方法。

于 2008-09-24T20:56:52.483 回答
1

读取字节缓冲区然后写入它是最快的。像这样的方法ReadLine()需要寻找行分隔符,这比仅仅填充缓冲区需要更多的时间。

于 2008-09-24T19:07:13.587 回答
0

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

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

于 2008-09-24T19:11:06.463 回答