File.ReadAllLines o Stream Reader

Podemos leer el archivo usando StreamReader o usando File.ReadAllLines .

Por ejemplo, quiero cargar cada línea en una List o string[] para una mayor manipulación en cada línea.

 string[] lines = File.ReadAllLines(@"C:\\file.txt"); foreach(string line in lines) { //DoSomething(line); } 

o

 using (StreamReader reader = new StreamReader("file.txt")) { string line; while ((line = reader.ReadLine()) != null) { //DoSomething(line); or //save line into List } } //if list is created loop through list here 

Aplicación vienen a través de diferentes tamaños de archivo de texto. Lo que podría crecer de pocos KBs a MBs vez en cuando.

Mi pregunta es ¿cuál es la forma preferida y por qué debería preferirse una sobre la otra?

Si desea procesar cada línea de un archivo de texto sin cargar todo el archivo en la memoria, el mejor enfoque es el siguiente:

 foreach (var line in File.ReadLines("Filename")) { // ...process line. } 

Esto evita cargar el archivo completo y usa una función .Net existente para hacerlo.

Sin embargo, si por alguna razón necesita almacenar todas las cadenas en una matriz, es mejor que use File.ReadAllLines() , pero si solo está usando foreach para acceder a los datos de la matriz, entonces use File.ReadLines() .

Microsoft usa un StreamReader en File.ReadAllLines:

  private static String[] InternalReadAllLines(String path, Encoding encoding) { Contract.Requires(path != null); Contract.Requires(encoding != null); Contract.Requires(path.Length != 0); String line; List lines = new List(); using (StreamReader sr = new StreamReader(path, encoding)) while ((line = sr.ReadLine()) != null) lines.Add(line); return lines.ToArray(); } 

El StreamReader lee el archivo línea por línea, consumirá menos memoria. mientras que File.ReadAllLines lee todas las líneas a la vez y las almacena en la cadena [], consumirá más memoria. Y si esa cadena [] es más grande que int.maxvalue, producirá un desbordamiento de memoria (límite de 32 bits del sistema operativo).

Entonces, para archivos más grandes, StreamReader será más eficiente.