2011-11-04 12 views
16

大きなテキスト文書を作成する必要があります。私は現在StringBuilderを使用して文書を作成し、次にFile.WriteallText(filename,sb.ToString)を呼び出します。残念ながら、これは現在、メモリの例外をスローするようになっています。ストリームStringBuilderをファイル

StringBuilderをファイルにストリームするには、より良い方法がありますか、使用する必要があるその他の技術はありますか?

+1

あなたは追加するテキストでFile.WriteAllTextを実行するのではなく、文字列ビルダを使用して一度にすべてを行うことはできますか? –

+3

@Baliは 'WriteAllText'を呼び出すために、すべてのテキストを持つ必要があるので、メモリの問題に役立ちません。 –

+0

@MarcGravellああ、私の間違い、ありがとうMarc –

答えて

21

代わり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コードが異なるターゲットを収容するために変更する必要はありませんでした。これはネットワークに直接書き込むことも、圧縮/暗号化ストリームを使って書き込むこともできます。非常に汎用性があります。

1

ストリームに直接ストリーミングしないのはなぜですか? TextWriterを使用できます。

0

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

5

だけFileStreamに書き込みStreamWriterを使用します。

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

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

+1

なぜdownvoteですか?あなたが間違っていると思われることを説明しなければ、答えを改善することはできません。 – Guffa