【问题标题】:When shall I do a explicity Flush() while copying streams in C#?在 C# 中复制流时,我什么时候应该执行明确的 Flush()?
【发布时间】:2012-10-09 20:58:09
【问题描述】:

我有一种方法可以将一个流复制到另一个流中。这是相当简单和典型的:

public static void CopyStream(Stream source, Stream destination)
{
    byte[] buffer = new byte[32768];
    int read;
    while ((read = source.Read(buffer, 0, buffer.Length)) > 0)
    {
        destination.Write(buffer, 0, read);
    }
}

当目标流是FileStream 时,我观察到在复制完成并且目标流关闭之前不会创建文件。我相信在复制流时不时调用destination.Flush() 会创建文件并在复制完成之前开始将内容写入磁盘,这会释放我系统中的内存。

这个destination.Flush() 电话应该在什么时候完成?我的算法循环中的每次迭代?每 N 次迭代?从来没有?

【问题讨论】:

  • 在复制完成和目标流关闭之前创建文件是否重要?
  • 直奔主题spender。为什么要在创建文件时关心?在流完成写入之前,您无论如何都无法读取它。
  • 只是性能问题,:-)

标签: c# .net stream filestream


【解决方案1】:

视情况而定。

  • 您希望副本的健壮程度如何?
  • 部分数据有多大用处?

如果即使一个数据缓冲区也有用,那么您可以在每次迭代时调用 Flush,否则您可能会在每 5th 调用它。但是,如果部分数据无用,则根本不调用Flush 是有意义的。

如果内存是个问题,那么更频繁地调用Flush 将是一件好事。

【讨论】:

    【解决方案2】:

    我认为没有硬性和快速的答案。提供了刷新,因此您可以控制存储何时有效地从内存移动到流。因此,选择权在您手中,每次循环迭代都执行此操作以减少内存使用量,减少执行频率以提高性能,但会以内存为代价。

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 2012-12-02
      • 1970-01-01
      • 2013-11-16
      • 2011-07-26
      • 2013-10-31
      • 2010-12-30
      • 2011-06-16
      相关资源
      最近更新 更多