【问题标题】:Read data in FileStream into a generic Stream将 FileStream 中的数据读入通用 Stream
【发布时间】:2010-09-12 20:26:20
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 高效是什么意思?那是最快的,使用最少的内存,还是其他一些标准?

标签: c# stream


【解决方案1】:

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

【讨论】:

  • 我真的很喜欢那篇关于并行任务观点的文章,但该流复制本身就非常有用。但是,如果流确实支持 Length 属性(如果 CanSeek 为 false,则例外),则缓冲区应该是输入流的长度,并且在一次读取中完成。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        相关资源
        最近更新 更多