C# с использованием потоков



потоки для меня загадочны. Я не знаю, когда использовать, какой поток и как их использовать. Может кто-нибудь объяснить мне, как использовать потоки?



если я правильно понимаю, есть три вида потока:




  • stream

  • read stream

  • write stream


это правильно? И, например, в чем разница между a Memorystream и FileStream?

654   7  

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. Таким образом, всегда есть базовый поток, над которым создается обертка потока, и поэтому обертка названа в честь типа базового потока ie FileStream,MemoryStream etc.

преимущество обертки потока заключается в том, что вы получаете унифицированный api для взаимодействия с потоками любого базового типа usb, file etc.

почему вы рассматриваете данные как поток - поскольку фрагменты данных загружаются по требованию, мы можем проверять/обрабатывать данные как фрагменты, а не загружать все данные в память. Вот как большинство программ имеют дело с большими файлами, например, шифрование файла образа ОС.

Я бы не назвал эти различные виды потоков. Класс Stream имеет свойства CanRead и CanWrite, которые сообщают вам, можно ли читать и записывать конкретный поток.

основное различие между различными классами потоков (например, MemoryStream vs FileStream) - это резервное хранилище, где данные считываются или куда они записываются. Это очевидно из названия. MemoryStream хранит данные только в памяти, FileStream поддерживается файлом на диске, a NetworkStream считывает данные из сети и так далее.

Comments

    Ничего не найдено.