2010-08-23 11 views
38

All'inizio ho usato un StreamReader per leggere il testo da un file:Qualche differenza tra File.ReadAllText() e l'utilizzo di uno StreamReader per leggere il contenuto del file?

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

ma venne a sapere File.ReadAllText che sembra per semplificare il mio codice a 1 riga. Ci sono differenze tra i due? Quando dovrei usarne uno sull'altro?

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

risposta

40

Non ci sono differenze se si utilizza il metodo ReadToEnd(). La differenza è se si sta utilizzando il metodo ReadLine() per file di grandi dimensioni in quanto non si sta caricando l'intero file in memoria, ma piuttosto si consente di elaborarlo in blocchi.

Quindi utilizzare File.ReadAllText() anziché ReadToEnd() in quanto rende il codice più breve e più leggibile. Inoltre si occupa di disporre correttamente delle risorse, come si potrebbe dimenticare di fare con un StreamReader (come hai fatto nel tuo frammento).

17

Se si utilizza ReadToEnd, sono uguali. In caso contrario, l'utilizzo di StreamReader consente di leggere byte alla volta, eseguire alcuni calcoli con essi e quindi eliminarli in base alle esigenze. Ad esempio, se si ha un file contenente un elenco di 2.000 numeri, e si vuole aggiungere insieme, si potrebbe:

  • chiamata File.ReadAllText di leggere tutto in una stringa e poi analizzare attraverso quella stringa per calcolare la somma .
  • Oppure è possibile creare un numero StreamReader e leggere alcuni byte alla volta, calcolando la somma man mano che si procede.

La principale differenza tra questi due approcci è l'utilizzo della memoria temporanea. Dopo aver ottenuto la somma, puoi sempre eliminare tutti i dati intermedi. Nell'approccio File.ReadAllText, ad un certo punto si aveva l'intero contenuto del file in memoria, mentre con l'approccio StreamReader, si avevano solo pochi byte del contenuto del file in memoria in qualsiasi momento. Questo può essere un problema a seconda della dimensione dei tuoi file e del tipo di calcolo che stai facendo.

File.ReadAllText è conveniente e veloce. StreamReader è potente ma più efficace.

17

Guardando il codice all'interno di mscorlib, File.ReadAllText chiama effettivamente 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; 
} 
Problemi correlati