【问题标题】:File I/O best practice - byte[] or FileStream?文件 I/O 最佳实践 - byte[] 还是 FileStream?
【发布时间】:2012-10-19 07:39:43
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net performance stream filestream


    【解决方案1】:

    byte[]/string 与流相比的优势可能在于 byte[]/string 在内存中,访问它可能更快。但是,如果文件非常大,您最终可能会出现分页,从而降低性能。 byte[]/string 方法的另一个优点是解析可能更容易一些(例如,只需使用 File.ReadAllText)。

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

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

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

    【讨论】:

    • 流是对数据序列的抽象。没有什么可以阻止 Stream 完全在内存中。因此是 MemoryStream。
    • 当然,将文件加载到 MemoryStream 本质上与 byte[] 相同,只是为了抽象。但是,出于这个问题的目的,值得注意的是 FileStream 不会将整个文件加载到内存中(保存一些缓冲等)。
    • @Marcus - 您能否在文件 I/O 的上下文中展示一些具有 C# async/await 功能的示例?
    • @Geotarget:很多例子都可以在微软网站上找到,例如:msdn.microsoft.com/en-us/library/kztecsys.aspx
    【解决方案2】:

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

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

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

    【讨论】:

    • 稍微更新了我的答案。它应该涵盖您的所有问题。
    【解决方案3】:

    在为文本文件生成数据时

    如果文件数据刷新是立即的,您的选择是StreamWriter 而不是FileStream。如果没有,那么StringBuilder

    同时为二进制文件生成数据?

    MemoryStream 是一个选择。此外,BinaryWriter 优先于 memstream。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2012-10-21
      • 1970-01-01
      • 2011-03-28
      • 2020-12-01
      • 2011-03-21
      相关资源
      最近更新 更多