2010-10-13 13 views
11

Supponendo che sono interessato solo a gestire i file di testo, quali sono i vantaggi o svantaggi specifici forniti dai metodi System.IO.File rispetto a StreamWriter?C# I/O - Differenza tra System.IO.File e StreamWeader/StreamReader

Esistono fattori di prestazione? Qual è la differenza fondamentale e quale di questi dovrebbe essere usato in quali casi?

Un'altra domanda, se voglio leggere il contenuto di un file in una stringa ed eseguire una query LINQ su di esso, che è meglio?

+0

File e StreamWriter/Reader sono * appena * analoghi. Puoi essere più specifico, come Aliostad ha richiesto, e stabilire * quali * metodi su 'File' stai confrontando? –

risposta

2

Quale metodo intendi?

WriteAllLines() e WriteAllText per esempio utilizza StreamWriter dietro la scena. Ecco l'output del riflettore:

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

In generale mi piacerebbe andare con System.IO.File sopra StreamReader come il primo è per lo più un wrapper conveniente per il secondo. considerare il codice dietro 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(); 
} 

È possibile utilizzare Reflector per controllare alcuni altri metodi, come si può vedere è piuttosto semplice

Per leggere il contenuto di il file, dare un'occhiata a:

12

C'è un po 'di storia interessante alle spalle i metodi apparentemente duplicati nella classe File. È nato dopo uno studio di usabilità su una versione preliminare di .NET. Hanno chiesto a un gruppo di programmatori esperti di scrivere codice per manipolare i file. Non sono mai stati esposti a .NET prima e solo i documenti da cui lavorare. Il tasso di successo era 0%.

Sì, c'è una differenza. Lo scoprirai quando proverai a leggere un file che è un gigabyte o più. Questo è un crash garantito sulla versione a 32 bit. Nessun problema con uno StreamReader che legge riga per riga, utilizzerà pochissima memoria. Dipende da cosa fa il resto del programma, ma cerca di limitare il metodo di convenienza a file non più grandi di, ad esempio, un paio di megabyte.