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