File.ReadLines() 和 File.ReadAllLines() 有什么区别?

62

我有一个关于File.ReadLines()和File.ReadAllLines()的查询。它们之间有什么区别?我有一个文本文件,其中数据以逐行方式包含。

File.ReadAllLines()

返回数组,使用File.ReadLines().ToArray();也可以得到相同的结果。那么这些方法之间是否存在与性能相关的差异?

string[] lines = File.ReadLines("C:\\mytxt.txt").ToArray();
或者
string[] lines = File.ReadAllLines("C:\\mytxt.txt");

2
看这个:http://msdn.microsoft.com/zh-cn/library/dd383503(v=vs.110).aspx - fzzle
3
ReadAllLines() 方法返回一个大数组。而 ReadLines() 方法则是一个迭代器,帮助你避免调用 ToArray() 方法,并使用 foreach 循环来编写更精简的代码,同时占用的内存也会更少。 - Hans Passant
@sachin 我知道Readalltext()和diffrence,但是在readline和readallline()之间感到困惑。 - sp_m
1
你的问题在什么是逐行读取文本文件的最快方法?中得到了解答。 - CodeCaster
3个回答

84

这些方法是否有性能差异?

是的,它们之间存在差异。

File.ReadAllLines() 方法一次读取整个文件并返回字符串数组,因此在处理大文件时需要花费时间,不建议使用,因为用户必须等待直到整个数组被返回。

File.ReadLines() 返回一个 IEnumerable<string>,它不会一次读取整个文件,因此在处理大文件时是更好的选择。

来自 MSDN 的说明:

ReadLines 和 ReadAllLines 方法的区别如下:

当您使用 ReadLines 时,您可以在整个集合返回之前开始枚举字符串集合;而当您使用 ReadAllLines 时,必须等待整个字符串数组返回后才能访问该数组。因此,在处理非常大的文件时,ReadLines 可能更有效。

示例 1: File.ReadAllLines()

string[] lines = File.ReadAllLines("C:\\mytxt.txt");

示例2:File.ReadLines()

foreach (var line in File.ReadLines("C:\\mytxt.txt"))
{

   //Do something     

}

5
在 foreach 循环中使用 File.ReadLines 后,它是否会关闭文件? - Maxter
我很好奇读取操作是否只在枚举器前进时继续,或者性能差异更多地是异步的。或者更明确地说:当循环继续时,下一行从文件中读取,还是文件被异步读取(和缓冲?),让我们“在[所有行被读取]之前开始枚举字符串集合”。 - Softerware

6

File.ReadLines 方法返回 IEnumerable<string> 类型。而 File.ReadAllLines 方法返回 string[] 类型。 如果你要读取一个大文件,最好使用 File.ReadLines 方法。因为它会逐行读取文件内容,而不是将整个文件读入内存中的 string[] 数组,从而节省了大量内存。参考MSDN


2

ReadAllLines

打开文本文件,读取文件的所有行,然后关闭文件。

如果您有小文件或必须一次处理整个文件,则使用此选项,因为它会完全读取文件,这意味着整个文件都在内存中。对于大型文件,它可能会降低性能。

ReadLines

使用 File.ReadLines 方法,您可以在整个集合返回之前开始枚举字符串集合。

如果您需要分块处理文件(而不是一次处理整个文件),则这很有用。

MSDN 中指出:

ReadLines 和 ReadAllLines 方法的区别如下:

当您使用 ReadLines 时,您可以在整个集合返回之前开始枚举字符串集合;当您使用 ReadAllLines 时,您必须等待整个字符串数组返回才能访问该数组。因此,在处理非常大的文件时,ReadLines 可能更有效。

此处提供更多详细信息和比较演示


这是不正确的。ReadLine 逐行读取。当您使用 ReadLines 时,可以在整个集合返回之前开始枚举字符串集合。来源:https://msdn.microsoft.com/zh-cn/library/dd383503(v=vs.110).aspx - Madivad
1
@Madivad 感谢您的评论,这是一个过时的答案,我现在已经更新了它。 - Zaheer Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接