File.ReadAllText()和使用StreamReader读取文件内容之间的任何区别?

时间:2010-08-23 07:12:51

标签: c#

起初我使用StreamReader来读取文件中的文字:

StreamReader reader = new StreamReader(dialog.OpenFile());
txtEditor.Text = reader.ReadToEnd();

但发现File.ReadAllText似乎将我的代码简化为1行。两者之间有什么不同吗?我何时应该使用另一个?

txtEditor.Text = File.ReadAllText(dialog.FileName);

4 个答案:

答案 0 :(得分:48)

如果您使用ReadToEnd()方法,则没有区别。不同之处在于,如果您对大文件使用ReadLine()方法,因为您没有将整个文件加载到内存中,而是允许您以块的形式处理它。

因此,请使用File.ReadAllText()代替ReadToEnd(),因为它会使您的代码更短,更易读。它还负责妥善处理资源,因为您可能忘记使用StreamReader(正如您在代码段中所做的那样)。

答案 1 :(得分:20)

查看mscorlib中的代码,File.ReadAllText实际上在内部调用StreamReader.ReadToEnd!

[SecurityCritical]
private static string InternalReadAllText(string path, Encoding encoding, bool checkHost)
{
    string result;
    using (StreamReader streamReader = new StreamReader(path, encoding, true, StreamReader.DefaultBufferSize, checkHost))
    {
        result = streamReader.ReadToEnd();
    }
    return result;
}

答案 2 :(得分:19)

如果您使用ReadToEnd,则它们是相同的。否则,使用StreamReader允许您一次读取字节,使用它们进行一些计算,然后根据需要将它们丢弃。例如,如果您有一个包含2,000个数字列表的文件,并且您想将它们一起添加,则可以:

  • 调用File.ReadAllText将所有内容读入字符串,然后解析该字符串以计算总和。
  • 您可以创建StreamReader并一次读取几个字节,随时计算总和。

这两种方法的主要区别在于瞬态内存使用。获得总和后,您可以随时丢弃所有中间数据。在File.ReadAllText方法中,在某些时候,您将整个文件内容放在内存中,而使用StreamReader方法,您在任何时候都只在内存中有几个字节的文件内容。这可能是一个问题,具体取决于文件的大小和您正在进行的计算类型。

File.ReadAllText方便快捷。 StreamReader功能强大但功能更多。

答案 3 :(得分:0)

如果您使用File.ReadAllText来读取非托管日志文件(由fstream控制),请调用File.ReadAllText,其中会有IO.Exception

  

该文件由另一个进程控制

您必须使用StreamReader ReadToEnd来替换它。