Вопрос
Потоки для меня загадочны.Я не знаю, когда какой поток использовать и как их использовать.Может ли кто-нибудь объяснить мне, как используются потоки?
Если я правильно понимаю, есть три типа потоков:
stream
read stream
write stream
Это верно?И, например, чем отличается Memorystream
и FileStream
?
Решение
А транслировать — это объект, используемый для передачи данных.Существует общий класс потока System.IO.Stream
, из которого получены все остальные классы потоков в .NET.А Stream
класс имеет дело с байтами.
Конкретные классы потоков используются для работы с другими типами данных, кроме байтов.Например:
- А
FileStream
класс используется, когда внешним источником является файл MemoryStream
используется для хранения данных в памятиSystem.Net.Sockets.NetworkStream
обрабатывает сетевые данные
Потоки чтения/записи, такие как StreamReader
и StreamWriter
не являются потоками - они не являются производными от System.IO.Stream
, они предназначены для облегчения записи и чтения данных, а также их потоковой передачи!
Другие советы
Чтобы немного расширить другие ответы здесь и помочь объяснить большую часть примера кода, который вы увидите пунктиром, большую часть времени вы не читаете и не записываете в поток напрямую.Потоки — это низкоуровневые средства передачи данных.
Вы заметите, что все функции чтения и записи ориентированы на байты, напримерЗаписьБайт().Нет функций для работы с целыми числами, строками и т. д.Это делает поток очень универсальным, но с ним сложнее работать, если, скажем, вы просто хотите передать текст.
Однако .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.(Если вы обмениваетесь данными с сетями или другими системами, вам необходимо помнить о порядок байтов, но это уже другой пост.)
Потоки хороши для работы с большими объемами данных.Когда нецелесообразно загружать все данные в память одновременно, вы можете открыть их как поток и работать с небольшими их фрагментами.
Stream — это просто абстракция (или оболочка) над physical
поток байтов.Этот physical
поток называется base stream
.Таким образом, всегда существует базовый поток, над которым создается оболочка потока, и поэтому оболочка называется в честь типа базового потока, т.е. FileStream
, MemoryStream
и т. д.
Преимущество оболочки потока заключается в том, что вы получаете унифицированный API для взаимодействия с потоками любого базового типа. usb, file
и т. д.
Почему вы рассматриваете данные как поток? - поскольку фрагменты данных загружаются по требованию, мы можем проверять/обрабатывать данные как фрагменты, а не загружать все данные в память.Именно так большинство программ работают с большими файлами, например, шифруя файл образа ОС.
Существует только один основной тип Stream
.Однако в различных обстоятельствах некоторые члены при вызове выдают исключение, поскольку в этом контексте операция недоступна.
Например MemoryStream
это просто способ перемещения байтов в область памяти и из нее.Следовательно, вы можете вызвать Read и Write на нем.
С другой стороны, FileStream
позволяет вам читать или записывать (или и то, и другое) из/в файл.Можете ли вы на самом деле читать или писать, зависит от того, как файл был открыт.Вы не можете выполнить запись в файл, если вы открыли его только для чтения.
Я бы начал с чтения потоков на MSDN:http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
Memorystream и FileStream — это потоки, используемые для работы с необработанной памятью и файлами соответственно...
Я бы не назвал эти разные виды потоков.Класс Stream имеет свойства CanRead и CanWrite, которые сообщают вам, можно ли читать и писать в конкретный поток.
Основное различие между различными классами потоков (например, MemoryStream и FileStream) заключается в резервном хранилище — откуда данные считываются или куда они записываются.Это как бы очевидно из названия.MemoryStream хранит данные только в памяти, FileStream поддерживается файлом на диске, NetworkStream считывает данные из сети и так далее.