2010-10-13 43 views
11

Suponiendo que estoy interesado solo en tratar con archivos de texto, ¿qué ventajas o desventajas específicas ofrecen los métodos System.IO.File en comparación con StreamWriter?C# I/O - Diferencia entre System.IO.File y StreamWriter/StreamReader

¿Hay algún factor de rendimiento involucrado? ¿Cuál es la diferencia básica y cuál de estos debe usarse en qué casos?

Una pregunta más, si quiero leer el contenido de un archivo en una cadena y ejecutar una consulta LINQ sobre ella, ¿cuál es la mejor?

+0

File y StreamWriter/Reader son * apenas * análogos. ¿Puede ser más específico, como ha pedido Aliostad, y estipular * qué * métodos en "Archivo" con los que está comparando? –

Respuesta

2

¿Qué método significa?

WriteAllLines() y WriteAllText por ejemplo utiliza StreamWriter detrás de la escena. Aquí está la salida del reflector:

public static void WriteAllLines(string path, string[] contents, Encoding encoding) 
{ 
if (contents == null) 
    { 
     throw new ArgumentNullException("contents"); 
    } 
    using (StreamWriter writer = new StreamWriter(path, false, encoding)) 
    { 
     foreach (string str in contents) 
     { 
      writer.WriteLine(str); 
     } 
    } 
} 


public static void WriteAllText(string path, string contents, Encoding encoding) 
{ 
    using (StreamWriter writer = new StreamWriter(path, false, encoding)) 
    { 
     writer.Write(contents); 
    } 
} 
4

En general, me gustaría ir con System.IO.File sobre StreamReader ya que el primero es sobre todo un envoltorio conveniente para este último. considerar el código detrás de File.OpenText:

public static StreamReader OpenText(string path) 
{ 
    if (path == null) 
    { 
     throw new ArgumentNullException("path"); 
    } 
    return new StreamReader(path); 
} 

O File.ReadAllLines:

private static string[] InternalReadAllLines(string path, Encoding encoding) 
{ 
    List<string> list = new List<string>(); 
    using (StreamReader reader = new StreamReader(path, encoding)) 
    { 
     string str; 
     while ((str = reader.ReadLine()) != null) 
     { 
      list.Add(str); 
     } 
    } 
    return list.ToArray(); 
} 

Puede utilizar el reflector de revisar algunos otros métodos, como se puede ver es bastante sencillo

Para leer el contenido de el archivo, échele un vistazo a:

12

Hay un poco de interesante historia detrás de los métodos aparentemente duplicados en la clase File. Se produjo después de un estudio de usabilidad en una versión preliminar de .NET. Le pidieron a un grupo de programadores experimentados que escribieran código para manipular archivos. Nunca antes habían estado expuestos a .NET y solo tenían los documentos para trabajar. La tasa de éxito fue 0%.

Sí, hay una diferencia. Lo descubrirás cuando trates de leer un archivo de un gigabyte o más. Eso es un bloqueo garantizado en la versión de 32 bits. No hay tal problema con un StreamReader que lea línea por línea, usará muy poca memoria. Depende de lo que haga el resto del programa, pero trate de limitar el método de conveniencia a archivos que no superen, digamos, un par de megabytes.

Cuestiones relacionadas