文件I / O最佳实践 - byte []或FileStream?

时间:2012-10-19 07:39:43

标签: c# .net performance stream filestream

我目前正在处理许多不同的文件类型(txt,二进制文件,办公室等)。我通常使用byte[]string将文件数据保存在内存中(在编写/解析时),为了将其读/写到文件中,我使用{{写入整个数据1}}数据完全处理完毕后。

  • 在生成文本文件的数据时,我应该使用FileStream而不是TextStream吗?
  • 在生成二进制文件的数据时,我应该使用string而不是FileStream吗?
  • 使用流可以提供更好的性能,而不是计算整个数据并在最后一次输出它吗?
  • 一般来说,文件I / O应该总是使用流,还是在某些情况下我的方法很好?

3 个答案:

答案 0 :(得分:3)

byte [] / string vs stream的优点可能是byte [] / string在内存中,访问它可能更快。但是,如果文件非常大,则可能会导致分页,从而降低性能。 byte [] / string方法的另一个优点是解析可能更容易一些(比如使用File.ReadAllText)。

如果您的解析允许(特别是如果您不需要随机搜索),使用FileStream可能会更高效,尤其是在文件相当大的情况下。此外,您可以使用C#(4.5)async / await功能来非常轻松地异步读取/写入文件并处理您读入的块。

就个人而言,如果我不太担心性能,或者文件非常小,我可能只是将文件读入内存。否则我会考虑使用流。

最后,我会说写一些简单的测试程序,如果你担心性能差异,可以计算每个测试程序的性能,这应该会给你最好的答案。

答案 1 :(得分:1)

除了讨论数据的大小之外,另一个重要问题是数据的目的。使用字符串和数组时,操作更容易。如果字符串和数组同样方便,则首选字节数组。必须解释字符串会带来复杂性(编码,BOM等),因此会增加错误的可能性。仅将字符串用于文本。二进制数据应始终由字节数组或流处理。

每当您不必执行任何操作或受影响的数据非常大或受影响的数据进入非常缓慢时,都应考虑使用流。流是逐个处理数据的自然方式,而字符串和数组通常期望数据在处理之前完整存在。

在流中工作通常会产生性能,因为它可以让异步读取和写入不同的通道。

答案 2 :(得分:1)

  

生成文本文件的数据

如果文件数据立即刷新,则您选择的StreamWriter超过FileStream。如果没有,那么StringBuilder

  

为二进制文件生成数据?

MemoryStream是一种选择。此外,首选{/ 3}}优先于记忆流。