Любая разница между File.ReadAllText() и использование StreamReader для чтения содержимого файла?
Сначала я использовал StreamReader
для чтения текста из файла:
StreamReader reader = new StreamReader(dialog.OpenFile());
txtEditor.Text = reader.ReadToEnd();
но узнал о File.ReadAllText
, который, кажется, упрощает мой код до 1 строки. Существуют ли различия между этими двумя? Когда я должен использовать один над другим?
txtEditor.Text = File.ReadAllText(dialog.FileName);
Ответы
Ответ 1
Нет различий, если вы используете метод ReadToEnd()
. Разница заключается в том, что вы используете метод ReadLine()
для больших файлов, так как вы не загружаете весь файл в память, а скорее можете обрабатывать его в кусках.
Поэтому используйте File.ReadAllText()
вместо ReadToEnd()
, так как ваш код становится короче и читабельнее. Он также заботится о том, чтобы правильно распоряжаться ресурсами, как вы могли бы забыть сделать с помощью StreamReader
(как и в вашем фрагменте).
Ответ 2
Если вы используете ReadToEnd
, они совпадают. В противном случае использование StreamReader
позволяет вам читать байты за раз, выполнять некоторые вычисления с ними и затем отбрасывать их по мере необходимости. Например, если у вас есть файл, содержащий список из 2000 номеров, и вы хотели бы добавить их вместе, вы могли бы:
- Вызовите
File.ReadAllText
, чтобы прочитать все в строку, а затем проанализировать эту строку, чтобы вычислить сумму.
- Или вы можете создать
StreamReader
и прочитать несколько байтов за раз, вычисляя сумму по мере ее поступления.
Основное различие между этими двумя подходами - использование временной памяти. После того, как у вас есть сумма, вы всегда можете выбросить все промежуточные данные. В подходе File.ReadAllText
в какой-то момент у вас было все содержимое файла в памяти, в то время как с подходом StreamReader
у вас было только одно количество файлов с байтами в памяти в любой момент времени. Это может быть проблемой в зависимости от размера ваших файлов и вида вычислений, которые вы делаете.
File.ReadAllText
удобен и быстр. StreamReader
является мощным, но более эффективным.
Ответ 3
Глядя на код в 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;
}