Luồng dữ liệu trong C#: StreamReader & StreamWriter [Thí dụ]

⚡ Tóm tắt thông minh

Luồng AC# là một lớp trung gian giữa ứng dụng của bạn và tệp tin, cho phép bạn đọc hoặc ghi dữ liệu theo từng phần nhỏ. Ở đây, bạn sẽ tìm hiểu về StreamReader và Stream.Writer Công việc, kèm theo ví dụ và các loại hình phổ biến.

  • 🌊 Những gì nó là: Luồng dữ liệu là một lớp trung gian giữa ứng dụng của bạn và một tập tin.
  • ???? StreamReader: StreamReader đọc văn bản từ một tệp tin từng dòng hoặc từng đoạn một.
  • 🇧🇷 SôngWriter: SôngWriter Ghi văn bản vào tệp thông qua luồng dữ liệu.
  • 🧩 Các loại luồng: FileStream, MemoryStream và BufferTất cả các lớp edStream đều kế thừa từ lớp Stream.
  • 🤖 Hỗ trợ từ AI: Các công cụ AI như GitHub Copilot tạo mã luồng C# ngay lập tức.

C# Stream Reader và Writer

Luồng C # là gì?

Trong các thao tác với tệp C#, các luồng thông thường được sử dụng để đọc và ghi vào tệp. Luồng là một lớp bổ sung được tạo giữa ứng dụng và tệp. Luồng này được sử dụng để đảm bảo các thao tác đọc và ghi vào tệp được trôi chảy.

Luồng thường được sử dụng khi đọc dữ liệu từ các tệp lớn. Bằng cách sử dụng các luồng, dữ liệu từ các tệp lớn được chia thành các phần nhỏ và gửi đến luồng. Những khối dữ liệu này sau đó có thể được đọc từ ứng dụng.

Lý do chia nó thành nhiều phần nhỏ là do tác động đến hiệu suất của việc đọc một tệp lớn trong một lần chụp. Nếu bạn đọc dữ liệu từ một tệp 100 MB trong một lần chụp, ứng dụng của bạn có thể bị treo và không ổn định. Cách tiếp cận tốt nhất là sử dụng các luồng để chia tệp thành các phần có thể quản lý được.

Vì vậy, khi thao tác ghi được thực hiện trên tệp, dữ liệu cần ghi trước tiên sẽ được ghi vào luồng. Từ luồng, dữ liệu sau đó được ghi vào tệp. Thao tác đọc cũng vậy. Trong thao tác đọc, dữ liệu đầu tiên được chuyển từ tệp sang luồng. Dữ liệu sau đó được đọc từ ứng dụng thông qua luồng. Hãy xem một ví dụ về cách chúng ta có thể đọc và viết bằng luồng.

Các loại luồng trong C#

Tất cả các lớp luồng trong C# đều kế thừa từ lớp abs.tract Stream lớp học trong System.IO Không gian tên. Mỗi loại nhắm đến một nguồn dữ liệu khác nhau nhưng chia sẻ cùng các phương thức đọc và ghi. Các luồng được sử dụng phổ biến nhất được liệt kê bên dưới.

  • Tập hồ sơ Đọc và ghi dữ liệu từ các tập tin trên ổ đĩa, mỗi lần một byte hoặc một khối dữ liệu.
  • Luồng bộ nhớ Lưu trữ dữ liệu trong bộ nhớ thay vì trong tệp, điều này rất hữu ích cho các bộ đệm tạm thời.
  • BufferedStream Bao bọc một luồng khác để giảm số lượng các thao tác chậm trên ổ đĩa hoặc mạng.
  • Luồng mạng Gửi và nhận dữ liệu qua một socket mạng.

Để làm việc với văn bản, C# cung cấp các công cụ sau: StreamReaderStreamWriter Các lớp hỗ trợ, bao bọc một luồng dữ liệu và sẽ được đề cập trong các phần tiếp theo.

Trình đọc luồng

Trình đọc luồng được sử dụng để đọc dữ liệu từ một tệp bằng luồng. Dữ liệu từ tệp đầu tiên được đọc vào luồng. Sau đó, ứng dụng sẽ đọc dữ liệu từ luồng.

Trong ví dụ của chúng tôi, chúng tôi sẽ giả sử rằng chúng tôi có một tệp trong ổ D có tên là example.txt. File sẽ là một file văn bản đơn giản và có 2 dòng như hình bên dưới

  • Guru99 – .Net
  • Guru99 -C#

Trong ví dụ của chúng tôi, chúng tôi sẽ tạo một ứng dụng Console đơn giản và làm việc với các luồng Tệp

Hãy xem một ví dụ về cách chúng ta có thể sử dụng các luồng để đọc dữ liệu từ một tệp. Nhập mã dưới đây vào tệp chương trình.cs.

Trình đọc luồng

using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
  class Tutorial
  {
   static void Main(string[] args)
   {
    String path = @"D:\Example.txt";

    using (StreamReader sr = File.OpenText(path))
    {
     String s = "";

     while ((s = sr.ReadLine()) != null)
     {
      Console.WriteLine(s);
     }
    }
   Console.ReadKey();
  }
 }
}

Code Giải trình:-

  1. Đầu tiên, chúng ta khai báo một đối tượng đọc luồng. Đối tượng trình đọc luồng được sử dụng trong C# để xác định luồng từ tệp đến ứng dụng. Dữ liệu sẽ được đẩy từ tệp vào luồng bất cứ khi nào dữ liệu được đọc từ tệp. Tập tin.OpenText được sử dụng để mở tệp “Example.txt” ở chế độ chỉ đọc. Sau đó, trình xử lý tệp sẽ được gửi đến đối tượng trình đọc luồng.
  2. Tiếp theo, chúng tôi xác định biến tạm thời 's' sẽ được sử dụng để đọc tất cả dữ liệu từ tệp.
  3. Sau đó chúng tôi sử dụng phương pháp đọc luồng ReadLine để đọc từng dòng từ bộ đệm luồng. Khi chúng tôi thực hiện điều này hoạt động, mỗi dòng đầu tiên sẽ được chuyển từ tệp đến bộ đệm. Sau đó, dòng chuỗi sẽ được chuyển từ bộ đệm đến biến 's'. Sau đó, chúng ta ghi nội dung của chuỗi 's' vào bảng điều khiển.

Khi mã trên được đặt và dự án được chạy bằng cách sử dụng Visual Studio, bạn sẽ nhận được kết quả đầu ra dưới đây.

Đầu ra: -

Trình đọc luồng

Từ đầu ra, bạn có thể thấy rằng Stream Reader đọc cả hai dòng từ tệp. Cuối cùng, các dòng của chuỗi đọc từ luồng đã được gửi tới Bảng điều khiển.

Sông Writer

Trình ghi luồng được sử dụng để ghi dữ liệu vào tệp bằng luồng. Dữ liệu từ ứng dụng lần đầu tiên được ghi vào luồng. Sau đó luồng ghi dữ liệu vào tệp. Hãy xem một ví dụ về cách chúng ta có thể sử dụng luồng để ghi dữ liệu từ một tệp. Nhập mã dưới đây vào tệp chương trình.cs.

Sông Writer

using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
  class Tutorial
  {
   static void Main(string[] args)
   {
    String path = @"D:\Example.txt";
    
    using (StreamWriter sr = File.AppendText(path))
    {
     sr.WriteLine("Guru99 - ASP.Net");
     sr.Close();

     Console.WriteLine(File.ReadAllText(path));
    }
    Console.ReadKey();
  }
 }
}

Code Giải trình:-

  1. Đầu tiên, chúng ta khai báo một đối tượng ghi luồng. Đối tượng trình ghi luồng được sử dụng trong C# để xác định luồng. Luồng sau đó được sử dụng để ghi dữ liệu từ ứng dụng vào tệp. Dữ liệu sẽ được đẩy từ ứng dụng sang luồng bất cứ khi nào dữ liệu cần được ghi. Lệnh File.AppendText được sử dụng để mở tệp “Example.txt” ở chế độ chắp thêm. Sau đó, trình xử lý tệp sẽ được gửi đến đối tượng trình ghi luồng.
  2. Chúng tôi đang sử dụng phương thức ghi luồng Writeline để ghi dòng “Guru99 – ASP.Net” vào luồng. Từ luồng, dòng đó sẽ được ghi vào tệp.
  3. Sau đó chúng tôi đóng trình ghi luồng sau khi ghi vào tệp. Thông thường, bạn nên đóng trình xử lý tệp khi tệp không còn cần thiết cho mục đích ghi.
  4. Cuối cùng, chúng ta đọc lại nội dung của tệp và ghi nó vào nhật ký bảng điều khiển. Điều này là để kiểm tra xem dòng đó có được ghi vào tập tin hay không.

Khi đoạn mã trên được thiết lập và dự án được chạy bằng Visual Studio, bạn sẽ nhận được kết quả đầu ra bên dưới.

Đầu ra: -

Sông Writer

Từ kết quả đầu ra, bạn có thể thấy dòng “GuruDòng chữ “99 – ASP.Net” đã được thêm vào tệp thành công. Cả 3 dòng văn bản đều hiển thị trong bảng điều khiển.

Câu Hỏi Thường Gặp

Luồng (stream) là một lớp trung gian giữa ứng dụng và tệp tin. Nó chia các tệp tin lớn thành các phần nhỏ để dữ liệu có thể được đọc hoặc ghi mà không cần tải toàn bộ tệp tin vào bộ nhớ.

StreamReader đọc dữ liệu văn bản từ một tệp thông qua luồng. Tệp.OpenText Phương thức này trả về một StreamReader, và phương thức ReadLine của nó đọc tệp từng dòng một.

SôngWriter Ghi dữ liệu văn bản vào tệp thông qua một luồng. Phương thức File.AppendText trả về một Stream.Writervà phương thức WriteLine của nó gửi từng dòng vào tệp.

Các luồng dữ liệu phổ biến bao gồm FileStream dành cho tập tin, MemoryStream dành cho dữ liệu trong bộ nhớ, BufferedStream dùng để đệm dữ liệu, và NetworkStream dùng cho socket. Tất cả đều kế thừa từ abs.tracLớp t Stream.

FileStream đọc và ghi các byte thô vào một tệp, trong khi StreamReader bao bọc một luồng để đọc văn bản dưới dạng ký tự và dòng. StreamReader dễ sử dụng hơn cho các tệp văn bản.

Các trợ lý AI như GitHub Copilot tự động hoàn thành StreamReader và StreamWriter Viết mã, thêm các khối `using` để xử lý việc giải phóng bộ nhớ và tạo các vòng lặp đọc tệp từ một đoạn chú thích ngắn.

Đúng vậy. Các công cụ hỗ trợ bởi trí tuệ nhân tạo tạo ra các phương thức đọc và ghi luồng dữ liệu, đề xuất bộ đệm cho các tệp lớn và thêm các câu lệnh `using` để đảm bảo các luồng được đóng một cách an toàn.

Câu lệnh `using` tự động đóng và giải phóng luồng khi khối lệnh kết thúc, ngay cả khi xảy ra lỗi. Điều này giải phóng tay cầm tệp và ngăn ngừa rò rỉ tài nguyên.

Tóm tắt bài viết này với: