Чтобы немного расширить другие ответы здесь и помочь объяснить большую часть примера кода, который вы увидите пунктирным, большую часть времени вы не читаете и не записываете в поток напрямую. Потоки - это низкоуровневое средство передачи данных.
Вы заметите, что все функции для чтения и записи ориентированы на байты, например 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. (Если вы обмениваетесь данными с сетями или другими системами, вам нужно помнить о порядке байтов , но это уже другая статья.)