2011-11-04 14 views
16

Devo creare un documento di testo di grandi dimensioni. Attualmente utilizzo StringBuilder per creare il documento e quindi chiamare File.WriteallText(filename,sb.ToString). Sfortunatamente, questo sta iniziando a eliminare le eccezioni di memoria.Stream StringBuilder su file

C'è un modo migliore per lo streaming di un file StringBuilder in file o c'è qualche altra tecnica che dovrei usare?

+1

Potrebbe non solo fare File.WriteAllText con il testo che si sta aggiungendo piuttosto che mettere in uno StringBuilder e fare tutto in una volta? –

+3

@Bali per chiamare 'WriteAllText' è necessario avere tutto il testo, in modo che non aiuti con problemi di memoria –

+0

@MarcGravell Ah si, errore mio, grazie Marc –

risposta

21

Invece di utilizzare StringBuilder, provare a utilizzare TextWriter (che ha un'API sostanzialmente simile, ma che può scrivere un numero di destinazioni sottostanti, inclusi i file) - cioè

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

Più in generale, è opportuno separare il codice che conosce i file dal codice che sa su come scrivere i dati, vale a dire

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

questo rende più facile scrivere a obiettivi diversi. Ad esempio, ora è possibile farlo in memoria troppo:

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

Il punto è: il codice Serialize non aveva bisogno di cambiare per accogliere un target diverso. Questo potrebbe anche scrivere direttamente su una rete, o scrivere attraverso un flusso di compressione/crittografia. Molto versatile.

1

Perché non lo streaming direttamente nel flusso? È possibile utilizzare TextWriter.

0

È possibile utilizzare StreamWriter e scrivere il file direttamente.

5

basta usare un StreamWriter che scrive ad un FileStream:

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

Ovviamente questo significa che non è possibile modificare il testo che è già scritto, come si può fare in un StringBuilder, ma suppongo che non lo stai usando comunque.

+1

Perché il downvote? Se non spieghi cosa pensi che sia sbagliato, non può migliorare la risposta. – Guffa