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