2010-08-23 32 views
38

起初我用了StreamReader來從文件中讀取文本:File.ReadAllText()和使用StreamReader讀取文件內容的區別?

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

,但發現了File.ReadAllText這似乎簡化了我的代碼,以1行。兩者之間有什麼不同嗎?我應該什麼時候使用一個?

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

回答

40

如果您使用的是ReadToEnd()方法,則沒有區別。不同之處在於,如果您對大文件使用ReadLine()方法,因爲您沒有將整個文件加載到內存中,而是允許您以塊的形式處理它。

因此,使用File.ReadAllText()而不是ReadToEnd(),因爲它使您的代碼更短,更具可讀性。它也會妥善處理資源,因爲您可能忘記了使用StreamReader(正如您在代碼段中所做的那樣)。

17

如果使用ReadToEnd,它們是相同的。否則,使用StreamReader將允許您一次讀取字節,然後對它們進行一些計算,然後根據需要將它們丟棄。例如,如果你有含2000號列表的文件,你想給他們加在一起,你可以:

  • 呼叫File.ReadAllText讀一切都變成字符串,然後通過該字符串來計算總和解析。
  • 您可以創建一個StreamReader並一次讀取幾個字節,隨時計算總和。

這兩種方法的主要區別是瞬態內存使用情況。獲得總和後,您可以隨時丟棄所有中間數據。在File.ReadAllText方法中,在某些時候,您將整個文件內容存儲在內存中,而使用StreamReader方法時,任何時候在內存中只有幾個字節的文件內容。這可能是一個問題,取決於您的文件大小和您正在執行的計算類型。

File.ReadAllText方便快捷。 StreamReader是強大的,但更多的工作。

17

查看mscorlib中的代碼,File.ReadAllText實際上在內部調用StreamReader.ReadToEnd!

[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; 
} 
相關問題