【问题标题】:File.ReadAllLines or Stream ReaderFile.ReadAllLines 或流阅读器
【发布时间】:2014-06-02 07:50:23
【问题描述】:

我们可以使用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

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

【问题讨论】:

  • 首选用于什么目的?速度、内存还是?
  • @YuvalItzchakov 谢谢,我正在查看链接。
  • @Steve,速度和内存。如果出现较大的文本文件,则应用程序应该有效地读取所有行。
  • 那么上面的链接应该会给你一个完整的答案

标签: c# winforms stream .net


【解决方案1】:

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

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

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

但是,如果由于某种原因您需要将所有字符串存储在一个数组中,最好只使用 File.ReadAllLines() - 但如果您只使用 foreach 访问数组中的数据,则使用File.ReadLines().

【讨论】:

  • @downvoter:想解释一下吗?对正确答案投反对票似乎很奇怪...... ;)
  • 可能被否决了,因为File.ReadLines() 将整个文件吞入内存(string[])。
  • @NicholasCarey 不,这是不这样做的版本:public static IEnumerable&lt;string&gt; ReadLines()... 因此我的评论“没有将整个文件加载到内存中”
  • @MatthewWatson 我同意你的看法,虽然这是一个老话题 - 任何想阅读这篇文章的人都赞成并且感到困惑。
【解决方案2】:

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();
    }

【讨论】:

    【解决方案3】:

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

    所以,对于更大的文件,StreamReader 会更有效率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-11
      • 2014-10-31
      • 1970-01-01
      • 2015-09-19
      • 2013-09-21
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      相关资源
      最近更新 更多