C# с использованием потоков
потоки для меня загадочны. Я не знаю, когда использовать, какой поток и как их использовать. Может кто-нибудь объяснить мне, как использовать потоки?
если я правильно понимаю, есть три вида потока:
streamread streamwrite stream
это правильно? И, например, в чем разница между a Memorystream и FileStream?
7 ответов:
A поток - это объект, используемый для передачи данных. Существует общий класс потока
System.IO.Stream, из которого выводятся все остальные потоковые классы в .NET. ЭлементStreamкласс имеет дело с байтами.конкретные классы потока используются для работы с другими типами данных, чем байты. Например:
- The
FileStreamкласс используется, когда внешним источником является файлMemoryStreamиспользуется для хранения данных вSystem.Net.Sockets.NetworkStreamобрабатывает сетевые данныечитатель/писатель потоки, такие как
StreamReaderиStreamWriterне являются потоками - они не являются производными отSystem.IO.Stream, Они предназначены, чтобы помочь писать и читать данные из и в потоке!
чтобы немного расширить другие ответы здесь, и помочь объяснить многие примеры кода, которые вы увидите пунктирно, большую часть времени вы не читаете и не пишете в поток напрямую. Потоки-это низкоуровневое средство передачи данных.
вы заметите, что все функции для чтения и записи ориентированы на байты, например 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, но это уже другой пост.)
потоки хороши для работы с большими объемами данных. Когда нецелесообразно загружать все данные в память одновременно, вы можете открыть его как поток и работать с небольшими фрагментами.
Я бы начал с чтения потоков на MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
Memorystream и FileStream-это потоки, используемые для работы с необработанной памятью и файлами соответственно...
существует только один основной тип
Stream. Однако в различных обстоятельствах некоторые члены будут выдавать исключение при вызове, потому что в этом контексте операция была недоступна.например a
MemoryStream- это просто способ перемещения байтов в блок памяти. Следовательно, вы можете вызвать чтение и запись на нем.С другой стороны
FileStreamпозволяет читать или писать (или оба) из/в файл. Можете ли вы на самом деле Чтение или запись зависит от способа открытия файла. Вы не можете писать в файл, если вы открыты только для чтения.
поток-это просто абстракция (или оболочка) над
physicalпоток байтов. Этоphysicalпоток называетсяbase stream. Таким образом, всегда есть базовый поток, над которым создается обертка потока, и поэтому обертка названа в честь типа базового потока ieFileStream,MemoryStreametc.преимущество обертки потока заключается в том, что вы получаете унифицированный api для взаимодействия с потоками любого базового типа
usb, fileetc.почему вы рассматриваете данные как поток - поскольку фрагменты данных загружаются по требованию, мы можем проверять/обрабатывать данные как фрагменты, а не загружать все данные в память. Вот как большинство программ имеют дело с большими файлами, например, шифрование файла образа ОС.
Я бы не назвал эти различные виды потоков. Класс Stream имеет свойства CanRead и CanWrite, которые сообщают вам, можно ли читать и записывать конкретный поток.
основное различие между различными классами потоков (например, MemoryStream vs FileStream) - это резервное хранилище, где данные считываются или куда они записываются. Это очевидно из названия. MemoryStream хранит данные только в памяти, FileStream поддерживается файлом на диске, a NetworkStream считывает данные из сети и так далее.
Comments