Щоб трохи розширити тут інші відповіді та допомогти пояснити багато прикладу коду, про який ви побачите пунктир, більшу частину часу ви не читаєте і не записуєте в потік безпосередньо. Потоки - це засіб низького рівня для передачі даних.
Ви помітите, що функції читання та запису орієнтовані на байт, наприклад WriteByte (). Немає функцій для роботи з цілими числами, рядками і т. Д. Це робить потік дуже загального призначення, але менш простий у роботі, якщо, скажімо, ви просто хочете передати текст.
Однак .NET надає класи, які конвертують між рідними типами та інтерфейсом потоку низького рівня та передають дані в поток або з потоку для вас. Деякі помітні такі класи:
StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader
Щоб скористатися ними, спочатку ви придбаєте свій потік, потім створіть один із перерахованих вище класів і пов'язуєте його з потоком. Напр
MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);
StreamReader і StreamWriter конвертують між нативними типами та їх рядковими поданнями, після чого передають рядки в потік і з нього у вигляді байтів. Так
myStreamWriter.Write(123);
запише "123" (три символи "1", "2", а потім "3") у потік. Якщо ви маєте справу з текстовими файлами (наприклад, html), StreamReader та StreamWriter - це класи, якими ви користуєтесь.
Тоді як
myBinaryWriter.Write(123);
запише чотири байти, що представляють 32-бітове ціле значення 123 (0x7B, 0x00, 0x00, 0x00). Якщо ви маєте справу з бінарними файлами або мережевими протоколами, ви можете використовувати BinaryReader і BinaryWriter. (Якщо ви обмінюєтесь даними з мережами чи іншими системами, вам потрібно пам’ятати про небезпеку , але це вже інша публікація.)