Để mở rộng một chút về các câu trả lời khác ở đây và giúp giải thích nhiều mã ví dụ mà bạn sẽ thấy rải rác, hầu hết thời gian bạn không đọc và ghi trực tiếp vào luồng. Luồng là một phương tiện cấp thấp để truyền dữ liệu.
Bạn sẽ nhận thấy rằng các hàm để đọc và ghi đều được định hướng theo byte, ví dụ như WriteByte (). Không có chức năng nào để xử lý số nguyên, chuỗi, v.v. Điều này làm cho luồng rất có mục đích chung, nhưng ít đơn giản hơn để làm việc với nếu bạn chỉ muốn chuyển văn bản.
Tuy nhiên, .NET cung cấp các lớp chuyển đổi giữa các kiểu gốc và giao diện luồng cấp thấp và chuyển dữ liệu đến hoặc từ luồng cho bạn. Một số lớp đáng chú ý như vậy là:
StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader
Để sử dụng các lớp này, trước tiên bạn có được luồng của mình, sau đó bạn tạo một trong các lớp ở trên và liên kết nó với luồng. Ví dụ
MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);
StreamReader và StreamWriter chuyển đổi giữa các kiểu gốc và các biểu diễn chuỗi của chúng, sau đó chuyển các chuỗi đến và từ luồng dưới dạng byte. Vì thế
myStreamWriter.Write(123);
sẽ viết "123" (ba ký tự '1', '2' rồi đến '3') vào luồng. Nếu bạn đang xử lý các tệp văn bản (ví dụ: html), StreamReader và StreamWriter là các lớp bạn sẽ sử dụng.
Trong khi
myBinaryWriter.Write(123);
sẽ viết bốn byte đại diện cho giá trị số nguyên 32-bit 123 (0x7B, 0x00, 0x00, 0x00). Nếu bạn đang xử lý các tệp nhị phân hoặc các giao thức mạng, BinaryReader và BinaryWriter là những gì bạn có thể sử dụng. (Nếu bạn đang trao đổi dữ liệu với mạng hoặc các hệ thống khác, bạn cần lưu ý đến tính bền vững , nhưng đó là một bài đăng khác.)