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

Поток StringBuilder для файла

Мне нужно создать большой текстовый документ. В настоящее время я использую StringBuilder для создания документа, а затем вызываю File.WriteallText(filename,sb.ToString). К сожалению, теперь это начинает исключать из памяти исключения.

Есть ли лучший способ передать файл StringBuilder в файл или есть какой-то другой метод, который я должен использовать?

4b9b3361

Ответ 1

Вместо использования StringBuilder попробуйте использовать TextWriter (который имеет широко похожий API, но который может записывать несколько базовых адресов, включая файлы) - i.e.

using(TextWriter writer = File.CreateText(path))
{
    // loop etc
    writer.Write(...);
}

В более общем смысле, стоит отделить код, который знает о файлах из кода, который знает о том, как записывать данные, т.е.

using(var writer = File.CreateText(path))
{
    Serialize(writer);
}
...
void Serialize(TextWriter writer)
{
    ...
}

это упрощает запись в разные объекты. Например, теперь вы можете делать и в памяти:

var sw = new StringWriter();
Serialize(sw);
string text = sw.ToString();

Точка: ваш код Serialize не должен меняться, чтобы разместить другую цель. Это может также быть запись непосредственно в сеть или запись через поток сжатия/шифрования. Очень универсальный.

Ответ 2

Просто используйте StreamWriter, который пишет в FileStream:

using (StreamWriter writer = new StreamWriter("filename.txt")) {
  ...
}

Это, конечно, означает, что вы не можете изменить текст, который уже написан, как вы можете сделать в StringBuilder, но я предполагаю, что вы все равно не используете его.

Ответ 3

Почему бы не потоковое прямо в поток? Вы можете использовать TextWriter.

Ответ 4

Вы можете использовать StreamWriter и напрямую записывать файл.