web-dev-qa-db-ja.com

StringBuilderをファイルにストリーミング

大きなテキストドキュメントを作成する必要があります。現在、StringBuilderを使用してドキュメントを作成し、File.WriteallText(filename,sb.ToString)を呼び出しています。残念ながら、これはメモリ不足の例外をスローし始めています。

StringBuilderをファイルにストリーミングするためのより良い方法はありますか、それとも私が使用すべき他のテクニックはありますか?

17
GreyCloud

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)
{
    ...
}

これにより、さまざまなターゲットへの書き込みが簡単になります。たとえば、メモリ内でも実行できるようになりました。

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

重要なのは、別のターゲットに対応するためにSerializeコードを変更する必要がないことです。これは、ネットワークに直接書き込むことも、圧縮/暗号化ストリームを介して書き込むこともできます。非常に用途が広い。

22
Marc Gravell

StreamWriterに書き込むFileStreamを使用するだけです。

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

もちろん、これは、StringBuilderでできるように、すでに書かれているテキストを変更できないことを意味しますが、とにかくそれを使用していないと思います。

5
Guffa

ストリームに直接ストリーミングしてみませんか? TextWriter を使用できます。

1
Simon

StreamWriterを使用して、ファイルに直接書き込むことができます。

0
ElDog