2011-11-04 20 views
16

Necesito crear un documento de texto grande. Actualmente uso StringBuilder para hacer el documento y luego llamo al File.WriteallText(filename,sb.ToString). Desafortunadamente, esto ahora está empezando a desechar las excepciones de memoria.Stream StringBuilder al archivo

¿Hay una manera mejor de transmitir un StringBuilder al archivo o hay alguna otra técnica que debería estar usando?

+1

¿No podría simplemente hacer File.WriteAllText con el texto que está agregando en lugar de ponerlo en un generador de cadenas y hacerlo todo a la vez? –

+3

@Bali para llamar a 'WriteAllText' necesita tener todo el texto, por lo que no ayuda con los problemas de memoria –

+0

@MarcGravell Ah sí, mi error, gracias Marc –

Respuesta

21

En lugar de utilizar StringBuilder, trate de usar TextWriter (que tiene una API similar en términos generales, pero que se puede escribir en una serie de destinos subyacentes, incluyendo archivos) - es decir

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

De manera más general, vale la pena separar el código que sabe acerca de los archivos de código que sabe acerca de cómo escribir los datos, es decir

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

esto hace que sea más fácil escribir para diferentes objetivos. Por ejemplo, ahora se puede hacer en memoria también: ser

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

El punto: su código Serialize no necesita cambiar para acomodar un objetivo diferente. Esto también podría estar escribiendo directamente en una red, o escribiendo a través de una corriente de compresión/encriptación. Muy versátil.

1

¿Por qué no se transmite directamente a la transmisión? Puede usar el TextWriter.

0

Puede usar StreamWriter y escribir en el archivo directamente.

5

sólo tiene que utilizar un StreamWriter que escribe en un FileStream:

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

Esto por supuesto significa que no se puede cambiar el texto que ya está escrito, como se puede hacer en un StringBuilder, pero supongo que no estás usando eso de todos modos.

+1

¿Por qué el voto a favor? Si no explica qué es lo que cree que está mal, no puede mejorar la respuesta. – Guffa