Подтвердить что ты не робот

Любая разница между File.ReadAllText() и использование StreamReader для чтения содержимого файла?

Сначала я использовал StreamReader для чтения текста из файла:

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

но узнал о File.ReadAllText, который, кажется, упрощает мой код до 1 строки. Существуют ли различия между этими двумя? Когда я должен использовать один над другим?

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

Ответ 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;
}