c# - 文件 I/O 最佳实践 - byte[] 还是 FileStream?

标签 c# .net performance stream filestream

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

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

最佳答案

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

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

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

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

关于c# - 文件 I/O 最佳实践 - byte[] 还是 FileStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12969555/

相关文章:

c++ - iota、generate 和手动循环是否都执行相同的操作?

c# - 以 double 转换字典键

c# - submitchanges() 后数据库没有更新

c# - 如何清除 Windows Phone 7 中的 Web 浏览器控制 cookie

c# - 如何使用可选参数从 C# 调用用 VB.NET 编写的方法

4.0 和 4.5.1 的 ASP.NET Web Farm 导致无效的回发或回调参数异常

c# - 后台代理中的静态变量值不同

C# Xml 反序列化 - 保留子顺序

arrays - 在元胞数组中存储句柄对象时性能下降

c++ - 有没有希望有效地调用 std::variant 上的公共(public)基类方法?