Stream StringBuilder в файл

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

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

4 ответов


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

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

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

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

это упрощает запись в разные цели. Например, теперь вы можете сделать in-memory тоже:

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

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


просто использовать StreamWriter это записывает в FileStream:

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

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


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


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