3

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

  • 我应该使用 aTextStream而不是string为文本文件生成数据吗?
  • 我应该使用 aFileStream而不是byte[]while 为二进制文件生成数据吗?
  • 使用流是否会给我更好的性能,而不是计算整个数据并在最后一口气输出?
  • 文件 I/O 应该始终使用流是一般规则,还是在某些情况下我的方法很好?
4

3 回答 3

4

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

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

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

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

于 2012-10-19T07:57:05.967 回答
1

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

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

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

于 2012-10-19T08:50:06.427 回答
1

在为文本文件生成数据时

如果文件数据刷新是立即的,那么您的选择是StreamWriterFileStream. 如果没有,那么StringBuilder.

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

MemoryStream是一种选择。此外,BinaryWriter首选内存流。

于 2012-10-19T09:43:53.463 回答