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

Jie*_*eng 45 c#

起初我用a StreamReader来读取文件中的文本:

StreamReader reader = new StreamReader(dialog.OpenFile());
txtEditor.Text = reader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)

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

txtEditor.Text = File.ReadAllText(dialog.FileName);
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 52

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

因此,使用File.ReadAllText()而不是ReadToEnd()因为它使您的代码更短,更易读.它还负责妥善处理资源,因为您可能会忘记使用StreamReader(就像您在代码片段中所做的那样).


tom*_*med 22

查看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;
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*ich 19

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

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

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

File.ReadAllText方便快捷. StreamReader是强大但更多的工作.