C # I / O - Разница между System.IO.File и StreamWriter / StreamReader - PullRequest
13 голосов
/ 13 октября 2010

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

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

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

Ответы [ 3 ]

14 голосов
/ 13 октября 2010

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

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

4 голосов
/ 13 октября 2010

Обычно я бы пошел с 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, чтобы проверить некоторые другие методы, поскольку вы можете видеть, что это довольно просто

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

2 голосов
/ 13 октября 2010

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

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...