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

起初,我使用StreamReader从文件中读取文本:

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

但发现了关于File.ReadAllText这似乎简化我的代码到1行。 两者有什么分别吗? 我应该什么时候使用一个?

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

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

因此,使用File.ReadAllText()而不是ReadToEnd()因为它使您的代码更短,更具可读性。 它也照顾妥善处理资源,因为你可能会忘记做一个StreamReader (就像你在代码片段中做的那样)。

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

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

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

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

看看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; }