File.ReadAllLines或Stream Reader

时间:2014-06-02 07:50:23

标签: c# winforms stream .net

我们可以使用StreamReaderFile.ReadAllLines来阅读文件。

例如,我想将每一行加载到Liststring[],以便在每一行进行进一步操作。

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

foreach(string line in lines)
{
     //DoSomething(line);
}

using (StreamReader reader = new StreamReader("file.txt"))
{
    string line;

    while ((line = reader.ReadLine()) != null)
    {
       //DoSomething(line); or //save line into List<string>
    }
}

//if list is created loop through list here 

应用程序遇到不同大小的文本文件。偶尔可以从少数KBs增长到MBs

我的问题是哪一个是首选的方式,为什么一个应该优先于其他方式?

3 个答案:

答案 0 :(得分:13)

Microsoft在File.ReadAllLines中使用StreamReader:

    private static String[] InternalReadAllLines(String path, Encoding encoding)
    {
        Contract.Requires(path != null);
        Contract.Requires(encoding != null);
        Contract.Requires(path.Length != 0);

        String line;
        List<String> lines = new List<String>();

        using (StreamReader sr = new StreamReader(path, encoding))
            while ((line = sr.ReadLine()) != null)
                lines.Add(line);

        return lines.ToArray();
    }

答案 1 :(得分:13)

如果要处理文本文件的每一行而不将整个文件加载到内存中,最好的方法是这样的:

foreach (var line in File.ReadLines("Filename"))
{
    // ...process line.
}

这可以避免加载整个文件,并使用现有的.Net函数来执行此操作。

但是,如果出于某种原因需要将所有字符串存储在数组中,那么最好只使用File.ReadAllLines() - 但如果您只使用foreach来访问数据在数组中,然后使用File.ReadLines()

答案 2 :(得分:1)

StreamReader逐行读取文件,它将消耗更少的内存。 而File.ReadAllLines一次读取所有行并将其存储到string []中,它将消耗更多内存。如果该字符串[]大于int.maxvalue则会产生内存溢出(限制为32位操作系统)。

因此,对于更大的文件,StreamReader将更有效。