C# 文件I/O最佳实践-字节[]还是FileStream?

C# 文件I/O最佳实践-字节[]还是FileStream?,c#,.net,performance,stream,filestream,C#,.net,Performance,Stream,Filestream,我目前正在处理许多不同的文件类型(txt、二进制、office等)。我通常使用byte[]或string将文件数据保存在内存中(在写入/解析时),为了将其读/写到文件中,我在数据完全处理后使用FileStream写入整个数据 在为文本文件生成数据时,是否应该使用TextStream而不是string 在为二进制文件生成数据时,是否应该使用FileStream而不是byte[] 使用流是否会给我带来更好的性能,而不是计算整个数据并在最后一次性输出 文件I/O应该始终使用流,这是一条一般规则,还是

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

  • 在为文本文件生成数据时,是否应该使用
    TextStream
    而不是
    string
  • 在为二进制文件生成数据时,是否应该使用
    FileStream
    而不是
    byte[]
  • 使用流是否会给我带来更好的性能,而不是计算整个数据并在最后一次性输出
  • 文件I/O应该始终使用流,这是一条一般规则,还是在某些情况下我的方法很好

字节[]/字符串相对于流的优点可能是字节[]/字符串位于内存中,访问它可能更快。但是,如果文件非常大,可能会导致分页,从而降低性能。byte[]/string方法的另一个优点是解析可能更容易一些(比如说,只需使用File.ReadAllText)

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

就我个人而言,如果我不太担心性能,或者文件很小,我可能会将文件读入内存。否则我会考虑使用流。< /P>
最后,我会说,编写一些简单的测试程序,并对每个程序的性能进行计时。如果您担心性能差异,这将为您提供最佳答案。

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

每次不必执行任何操作,或者主题数据非常大,或者主题数据输入速度非常慢时,都应该考虑流。流是一种逐部分处理数据的自然方式,而字符串和数组通常希望数据在处理之前完整地存在

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

为文本文件生成数据时

如果文件数据刷新是立即进行的,则您的选择超出了范围。若否,则为

为二进制文件生成数据时


这是一种选择。此外,最好是通过memstream。

流是对数据序列的抽象。没有什么可以阻止流完全在内存中。因此是一个MemoryStream。当然,将文件加载到MemoryStream本质上与字节[]相同,只是为了抽象。然而,就这个问题而言,值得注意的是,文件流不会将整个文件加载到内存中(除了一些缓冲等)。@Marcus-你能展示一些在文件I/O上下文中具有C#async/await功能的示例吗?@Geotarget:很多示例都可以在Microsoft网站上找到,例如:更新了一点我的答案。它应该涵盖你所有的问题。