起初我使用StreamReader
来读取文件中的文字:
StreamReader reader = new StreamReader(dialog.OpenFile());
txtEditor.Text = reader.ReadToEnd();
但发现File.ReadAllText
似乎将我的代码简化为1行。两者之间有什么不同吗?我何时应该使用另一个?
txtEditor.Text = File.ReadAllText(dialog.FileName);
答案 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
来替换它。