Для меня потоки загадочны. Я не знаю, когда использовать какой поток и как их использовать. Может кто-нибудь объяснить мне, как используются потоки?
Если я правильно понял, есть три типа потоков:
stream
read stream
write stream
Это верно? И, например, в чем разница между а Memorystream
и а FileStream
?
Stream
), которая предоставляет некоторые полезные методы, такие как чтение, запись и изменение позиции. Теперь вы можете создавать классы на основе их резервного хранилища (FileStream, MemoryStream), которые наследуютсяStream
и основываются на этой функциональности на основе конкретного резервного хранилища.Ответы:
Поток представляет собой объект , используемый для передачи данных. Существует общий класс потока
System.IO.Stream
, от которого наследуются все другие классы потоков в .NET.Stream
Класс имеет дело с байтами.Конкретные классы потоков используются для работы с другими типами данных, кроме байтов. Например:
FileStream
Класс используется , когда источник снаружи файлMemoryStream
используется для хранения данных в памятиSystem.Net.Sockets.NetworkStream
обрабатывает сетевые данныеПотоки чтения / записи, такие как потоки
StreamReader
иStreamWriter
не являются потоками - они не являются производнымиSystem.IO.Stream
, они предназначены для помощи в записи и чтении данных из потока и в поток!источник
Чтобы немного расширить другие ответы здесь и помочь объяснить большую часть примера кода, который вы увидите пунктирным, большую часть времени вы не читаете и не записываете в поток напрямую. Потоки - это низкоуровневое средство передачи данных.
Вы заметите, что все функции для чтения и записи ориентированы на байты, например WriteByte (). Здесь нет функций для работы с целыми числами, строками и т. Д. Это делает поток очень универсальным, но менее простым в работе, если, скажем, вы просто хотите передать текст.
Однако .NET предоставляет классы, которые преобразуют собственные типы в интерфейс низкоуровневого потока и передают данные в поток или из него. Некоторые известные такие классы:
Чтобы использовать их, сначала вы приобретаете свой поток, затем создаете один из указанных выше классов и связываете его с потоком. Например
StreamReader и StreamWriter преобразуют собственные типы в их строковые представления, а затем передают строки в поток и из потока как байты. Так
запишет в поток «123» (три символа «1», «2», затем «3»). Если вы имеете дело с текстовыми файлами (например, html), вам следует использовать классы StreamReader и StreamWriter.
В то время как
запишет четыре байта, представляющих 32-битное целое число 123 (0x7B, 0x00, 0x00, 0x00). Если вы имеете дело с двоичными файлами или сетевыми протоколами, вы можете использовать BinaryReader и BinaryWriter. (Если вы обмениваетесь данными с сетями или другими системами, вам нужно помнить о порядке байтов , но это уже другая статья.)
источник
Потоки хороши для работы с большими объемами данных. Когда нецелесообразно загружать все данные в память одновременно, вы можете открыть его как поток и работать с небольшими фрагментами.
источник
Stream - это просто абстракция (или оболочка) над
physical
потоком байтов. Этотphysical
поток называетсяbase stream
. Таким образом, всегда существует базовый поток, над которым создается оболочка потока, и поэтому оболочка названа в честь типа базового потокаFileStream
,MemoryStream
т. Е. И т. Д.Преимущество обертки потока заключается в том, что вы получаете унифицированный API для взаимодействия с потоками любого базового типа
usb, file
и т. Д.Зачем рассматривать данные как поток - поскольку фрагменты данных загружаются по запросу, мы можем проверять / обрабатывать данные как фрагменты, а не загружать все данные в память. Именно так большинство программ работают с большими файлами, например, для шифрования файла образа ОС.
источник
Есть только один основной тип
Stream
. Однако в различных обстоятельствах некоторые члены будут вызывать исключение при вызове, потому что в этом контексте операция была недоступна.Например
MemoryStream
- это просто способ перемещать байты в и из фрагмента памяти. Следовательно, вы можете вызвать на нем чтение и запись.С другой стороны, a
FileStream
позволяет вам читать или записывать (или и то, и другое) из / в файл. Возможность чтения или записи зависит от того, как был открыт файл. Вы не можете записать в файл, если открыли его только для чтения.источник
Я бы начал с чтения потоков в MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
Memorystream и FileStream - это потоки, используемые для работы с необработанной памятью и файлами соответственно ...
источник
Я бы не назвал эти разные виды потоков. Класс Stream имеет свойства CanRead и CanWrite, которые говорят вам, можно ли читать и записывать конкретный поток.
Основное различие между разными классами потоков (такими как MemoryStream и FileStream) - это резервное хранилище, откуда данные считываются или куда они записываются. Это как бы очевидно из названия. MemoryStream сохраняет данные только в памяти, FileStream поддерживается файлом на диске, NetworkStream считывает данные из сети и так далее.
источник