Есть ли разница между File.ReadAllText () и использованием StreamReader для чтения содержимого файла? - PullRequest
44 голосов
/ 23 августа 2010

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

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

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

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

Ответы [ 4 ]

50 голосов
/ 23 августа 2010

Нет различий, если вы используете метод ReadToEnd().Разница в том, что вы используете метод ReadLine() для больших файлов, так как вы загружаете не весь файл в память, а скорее позволяете обрабатывать его порциями

Поэтому используйте File.ReadAllText() вместо ReadToEnd(), поскольку это делает ваш код короче и более читабельным.Он также заботится о правильной утилизации ресурсов, как вы могли бы забыть сделать с StreamReader (как вы сделали в своем фрагменте).

21 голосов
/ 22 октября 2014

Глядя на код в 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;
}
19 голосов
/ 23 августа 2010

Если вы используете ReadToEnd, они одинаковы. В противном случае использование StreamReader позволяет вам читать байты за раз, делать с ними некоторые вычисления, а затем выбрасывать их по мере необходимости. Например, если у вас есть файл, содержащий список из 2000 чисел, и вы хотите добавить их вместе, вы можете:

  • Вызовите File.ReadAllText, чтобы прочитать все в строку, а затем проанализировать эту строку, чтобы вычислить сумму.
  • Или вы можете создать StreamReader и считывать несколько байтов за раз, вычисляя сумму по мере продвижения.

Основным различием между этими двумя подходами является временное использование памяти. Получив сумму, вы всегда можете выбросить все промежуточные данные. В подходе File.ReadAllText в какой-то момент у вас было все содержимое файла в памяти, в то время как при подходе StreamReader у вас было только несколько байтов содержимого файла в памяти одновременно. Это может быть проблемой в зависимости от размера ваших файлов и типа вычислений, которые вы делаете.

File.ReadAllText удобно и быстро. StreamReader это мощный, но больше работы.

0 голосов
/ 13 июля 2018

Если вы используете File.ReadAllText для чтения неуправляемого файла журнала (управление через fstream), позвоните File.ReadAllText, там будет IO.Exception:

Файл управляется другим процессом

Вы должны использовать StreamReader ReadToEnd для его замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...