缓冲流(BufferedStream)和内存流(MemoryStream)在应用方面有什么区别?

26

就应用而言,BufferedStream和MemoryStream有什么区别? 由于MemoryStream可以随时刷新到文件中,它能否取代BufferedStream呢?

2个回答

41

BufferedStream是现有流的缓冲区。MemoryStream是整个流的缓冲区,它没有链接到其他流。您可以随时要求将其写入另一个流中,但这并不相同。

缓冲区的主要原因之一是避免频繁地写入昂贵的资源。但这并不意味着您希望将所有数据都缓冲在内存中 - 只需要足够避免非常小的写入即可。例如,如果FileStream没有自己的缓冲策略,那么在使用BufferedStream包装它时,即使您写入了数兆字节的数据,缓冲区也可能是只有8K的。但正如评论中指出的那样, FileStream已具备足够的缓冲,与其同时使用BufferedStream是没有意义的


请查看BufferedStream: http://msdn.microsoft.com/zh-cn/library/system.io.bufferedstream.aspx 请查看MemoryStream: http://msdn.microsoft.com/zh-cn/library/system.io.memorystream.aspx - Mark Synowiec
1
@Jon:好的,我不想在这里反复强调一个已经解决的问题,但你如何/为什么使用BufferedStream呢?只是出于良好的实践习惯,当缓冲区需要可靠地按照我们所期望的方式工作时(例如通过指定其大小)吗? - richard
2
同时使用BufferedStream和FileStream没有任何好处。请参见http://blogs.msdn.com/b/brada/archive/2004/04/15/114329.aspx。从我的实验中看来,IsolatedStorageFileStream在Silverlight on Windows Phone 7上似乎不包含任何缓冲区,因此可能会从BufferedStream中受益。不幸的是,Silverlight没有BufferedStream实现。 - 1adam12
关于NetworkStream:据我所知,TCP协议栈已经提供了一些缓冲区。这将减少系统对内核的调用次数。我不确定添加另一层缓冲区能带来什么收益。它将减少对winsock2的调用次数。我想这可能会有所帮助。然而,所有这些都会增加一点延迟。你们觉得呢? - uriDium
@uriDium:我认为你需要在实际应用场景中进行测试,以找出与你的实际应用相关的内容。 - Jon Skeet
显示剩余5条评论

8

BufferedStream 必须由其他现有的流进行初始化。简单的关闭会触发将缓冲区刷新到底层流中。当使用非内存流但需要(自动)缓冲时,这是必需的。

MemoryStream 可以独立存在,但也可以像您所说的那样被'显式地'刷新到其他流中。

如果您的工作仅在内存中进行,则最好使用MemoryStream。否则,请使用BufferedStream。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接