2010-08-23 16 views
38

Lúc đầu, tôi sử dụng một StreamReader để đọc văn bản từ một tập tin:Bất kỳ sự khác biệt nào giữa File.ReadAllText() và sử dụng StreamReader để đọc nội dung tệp?

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

nhưng phát hiện ra về File.ReadAllText mà dường như đơn giản hóa mã của tôi để 1 dòng. Có sự khác biệt nào giữa hai người không? Khi nào tôi nên sử dụng cái kia?

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

Trả lời

40

Không có sự khác biệt nếu bạn đang sử dụng phương pháp ReadToEnd(). Sự khác biệt là nếu bạn đang sử dụng phương pháp ReadLine() cho các tệp lớn vì bạn không tải toàn bộ tệp vào bộ nhớ mà thay vào đó cho phép bạn xử lý tệp theo khối.

Vì vậy, hãy sử dụng File.ReadAllText() thay vì ReadToEnd() vì nó làm cho mã của bạn ngắn hơn và dễ đọc hơn. Nó cũng chăm sóc xử lý đúng tài nguyên như bạn có thể quên làm với một StreamReader (như bạn đã làm trong đoạn mã của bạn).

17

Nếu bạn sử dụng ReadToEnd, chúng giống nhau. Nếu không, bằng cách sử dụng StreamReader cho phép bạn đọc byte tại một thời điểm, thực hiện một số phép tính với chúng, và sau đó vứt chúng đi khi cần thiết. Ví dụ, nếu bạn đã có một tập tin chứa danh sách 2.000 số, và bạn muốn thêm chúng lại với nhau, bạn có thể:

  • Gọi File.ReadAllText để đọc tất cả mọi thứ vào một chuỗi và sau đó phân tích cú pháp thông qua đó chuỗi để tính tổng .
  • Hoặc bạn có thể tạo StreamReader và đọc một vài byte cùng một lúc, tính tổng như bạn đi.

Sự khác biệt chính giữa hai cách tiếp cận này là sử dụng bộ nhớ thoáng qua. Sau khi bạn có tổng, bạn luôn có thể ném tất cả dữ liệu trung gian đi. Trong phương pháp File.ReadAllText, tại một thời điểm nào đó bạn có toàn bộ nội dung tệp trong bộ nhớ, trong khi với phương pháp StreamReader, bạn chỉ có một vài byte nội dung tệp trong bộ nhớ cùng một lúc. Điều này có thể là một vấn đề tùy thuộc vào kích thước tệp của bạn và loại tính toán bạn đang làm.

File.ReadAllText thuận tiện và nhanh chóng. StreamReader mạnh mẽ nhưng hiệu quả hơn.

17

Nhìn vào mã trong mscorlib, File.ReadAllText thực sự gọi StreamReader.ReadToEnd nội bộ!

[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; 
} 
Các vấn đề liên quan