С# I/O - Разница между System.IO.File и StreamWriter/StreamReader

Предполагая, что меня интересует только обработка текстовых файлов, какие конкретные преимущества или недостатки предоставляют методы System.IO.File по сравнению с StreamWriter?

Существуют ли какие-либо факторы эффективности? В чем основное отличие, и какие из них следует использовать в каких случаях?

Еще один вопрос: если я хочу прочитать содержимое файла в строке и запустить над ним запрос LINQ, что лучше?

Ответ 1

Там немного интересной истории за кажущиеся дублирующими методами в классе File. Это произошло после изучения удобства использования в предварительной версии .NET. Они попросили группу опытных программистов написать код для управления файлами. Раньше они никогда не сталкивались с .NET и просто работали с документами. Шанс успеха: 0%.

Да, есть разница. Вы узнаете, когда пытаетесь прочитать файл с гигабайтом или более. Это гарантированный сбой в 32-битной версии. Нет такой проблемы с StreamReader, который читает по очереди, он будет использовать очень мало памяти. Это зависит от того, что делает остальная часть вашей программы, но попытайтесь ограничить метод удобства файлами не более, чем, скажем, несколько мегабайт.

Ответ 2

В общем, я бы пошел с System.IO.File над StreamReader, так как первый в основном является удобной оболочкой для последней. рассмотрим код File.OpenText:

public static StreamReader OpenText(string path)
{
    if (path == null)
    {
        throw new ArgumentNullException("path");
    }
    return new StreamReader(path);
}

Или File.ReadAllLines:

private static string[] InternalReadAllLines(string path, Encoding encoding)
{
    List<string> list = new List<string>();
    using (StreamReader reader = new StreamReader(path, encoding))
    {
        string str;
        while ((str = reader.ReadLine()) != null)
        {
            list.Add(str);
        }
    }
    return list.ToArray();
}

Вы можете использовать Reflector, чтобы проверить некоторые другие методы, так как вы можете видеть это довольно просто.

Чтобы прочитать содержимое файла, посмотрите:

Ответ 3

Какой метод вы имеете в виду?

WriteAllLines() и WriteAllText, например, использует StreamWriter за сценой. Вот выход отражателя:

public static void WriteAllLines(string path, string[] contents, Encoding encoding)
{
if (contents == null)
    {
        throw new ArgumentNullException("contents");
    }
    using (StreamWriter writer = new StreamWriter(path, false, encoding))
    {
        foreach (string str in contents)
        {
            writer.WriteLine(str);
        }
    }
}


public static void WriteAllText(string path, string contents, Encoding encoding)
{
    using (StreamWriter writer = new StreamWriter(path, false, encoding))
    {
        writer.Write(contents);
    }
}