【问题标题】:What is the difference between BufferedStream and MemoryStream in terms of application?BufferedStream 和 MemoryStream 在应用方面有什么区别?
【发布时间】:2010-11-29 05:09:38
【问题描述】:

BufferedStream和MemoryStream在应用方面有什么区别? 既然 MemoryStream 可以随时刷入文件,那它不能代替 BufferedStream 吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    BufferedStream 只是现有流的缓冲区。 MemoryStream整个 流的缓冲区 - 它没有链接到另一个流。您可以随时要求它将自己写入另一个流,但这不是一回事。

    缓冲的主要原因之一是避免频繁写入昂贵的资源。但是,这并不意味着您要在内存中缓冲 所有 数据 - 足以避免非常小的写入。例如,如果FileStream 没有其自己的 缓冲策略,那么将其包装在BufferedStream 中可能最终只有8K 的缓冲区,即使您写入数兆字节的数据。正如 cmets 中指出的那样,FileStream has enough buffering that using BufferedStream in conjunction with it is pointless.

    【讨论】:

    • @Jon:FileStream 已经缓冲(因此它的 Flush 方法)。而且我在 BufferedStream 上看不到任何允许您设置要创建的缓冲区大小的属性。所以在我看来 BufferedStream 将是不必要或多余的。 . .仅仅是 BufferedStream 本身会创建比 FileStream 和其他 Stream 类更大的缓冲区吗?
    • @Richard:您可以在 BufferedStream 的构造函数重载之一中指定缓冲区大小。
    • @Jon:好的,我并不是要在这里打败一匹死马,但是那你如何/为什么要使用 BufferedStream 呢?当缓冲区需要按我们希望的方式可靠地工作时(即通过指定其大小),作为一种良好做法?
    • 同时使用 BufferedStream 和 FileStream 没有任何好处。见blogs.msdn.com/b/brada/archive/2004/04/15/114329.aspx。从我的实验看来,IsolatedStorageFileStream 不包括任何缓冲(至少在 Windows Phone 7 上的 Silverlight 上),因此可能会从 BufferedStream 中受益。不幸的是,Silverlight 没有 BufferedStream 实现。
    【解决方案2】:

    BufferedStream 必须由其他一些现有的 Stream 初始化。一个简单的关闭会触发将缓冲区刷新到底层流。处理非内存流时需要它,但您需要(自动)缓冲。

    MemoryStream 可以单独存在,但也可以按照您所说的“显式”刷新到其他流。

    如果您的工作只在内存上,最好使用 MemoryStream。否则,BufferedStream。

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2011-04-21
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多