2010-08-23 21 views
38

Al principio no se le StreamReader a leer el texto de un archivo:Cualquier diferencia entre File.ReadAllText() y el uso de un StreamReader para leer el contenido del archivo?

StreamReader reader = new StreamReader(dialog.OpenFile()); 
txtEditor.Text = reader.ReadToEnd(); 

pero se enteraron de File.ReadAllText que parece simplificar el código para la línea 1. ¿Hay alguna diferencia entre los dos? ¿Cuándo debería usar uno sobre el otro?

txtEditor.Text = File.ReadAllText(dialog.FileName); 

Respuesta

40

No existen diferencias si utiliza el método ReadToEnd(). La diferencia es si está utilizando el método ReadLine() para archivos grandes ya que no está cargando todo el archivo en la memoria, sino que le permite procesarlo en fragmentos.

Así que use File.ReadAllText() en lugar de ReadToEnd() ya que hace que su código sea más corto y más legible. También se ocupa de deshacerse de los recursos correctamente, ya que es posible que olvide hacerlo con un StreamReader (como lo hizo en su fragmento).

17

Si usa ReadToEnd, son lo mismo. De lo contrario, usar el StreamReader le permite leer bytes a la vez, hacer algunos cálculos con ellos y luego tirarlos según sea necesario. Por ejemplo, si usted tenía un archivo que contiene una lista de 2.000 números, y que quería sumarlos, se podría:

  • llamada File.ReadAllText para leer todo en una cadena y luego analizar a través de esa cadena para calcular la suma .
  • O puede crear un StreamReader y leer algunos bytes a la vez, calculando la suma sobre la marcha.

La principal diferencia entre estos dos enfoques es el uso de la memoria transitoria. Después de tener la suma, siempre puede tirar todos los datos intermedios. En el enfoque File.ReadAllText, en algún momento tenía todo el contenido del archivo en la memoria, mientras que con el enfoque StreamReader, solo tenía unos pocos bytes de contenido de archivos en la memoria en un momento dado. Esto puede ser un problema según el tamaño de tus archivos y el tipo de cálculo que estás haciendo.

File.ReadAllText es conveniente y rápido. StreamReader es poderoso pero más trabajo.

17

Al observar el código dentro de mscorlib, File.ReadAllText en realidad llama a StreamReader.ReadToEnd internamente.

[SecurityCritical] 
private static string InternalReadAllText(string path, Encoding encoding, bool checkHost) 
{ 
    string result; 
    using (StreamReader streamReader = new StreamReader(path, encoding, true, StreamReader.DefaultBufferSize, checkHost)) 
    { 
     result = streamReader.ReadToEnd(); 
    } 
    return result; 
} 
Cuestiones relacionadas