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

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

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

  • stream
  • read stream
  • write stream

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

Ответ 1

A поток - это объект, используемый для передачи данных. Существует общий класс потоков System.IO.Stream, из которого выводятся все другие классы потоков в .NET. Класс Stream имеет дело с байтами.

Конкретные потоковые классы используются для обработки других типов данных, кроме байтов. Например:

  • Класс FileStream используется, когда внешним источником является файл
  • MemoryStream используется для хранения данных в памяти
  • System.Net.Sockets.NetworkStream обрабатывает сетевые данные

Потоки чтения/записи, такие как StreamReader и StreamWriter, не являются потоками - они не являются производными от System.IO.Stream, они предназначены для записи и чтения данных из и в поток!

Ответ 2

Чтобы немного рассказать о других ответах здесь, и помогите объяснить много кода примера, который вы увидите пунктиром, большую часть времени вы не читаете и не пишете в поток напрямую. Потоки - это низкоуровневые средства для передачи данных.

Вы заметите, что функции для чтения и записи все ориентированы по байтам, например. 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, но это другое сообщение.)

Ответ 3

Потоки хороши для работы с большими объемами данных. Когда нецелесообразно одновременно загружать все данные в память, вы можете открыть его как поток и работать с небольшими кусками.

Ответ 4

Существует только один базовый тип Stream. Однако в некоторых случаях некоторые члены будут вызывать исключение при вызове, потому что в этом контексте операция недоступна.

Например, MemoryStream - это просто способ перемещения байтов в кусок памяти и из нее. Следовательно, вы можете вызвать "Чтение и запись" на нем.

С другой стороны, FileStream позволяет вам читать или записывать (или оба) из/в файл. Если вы действительно можете читать или писать, зависит от того, как файл был открыт. Вы не можете писать в файл, если вы только открыли его для чтения.

Ответ 5

Я бы начал с чтения на потоках в MSDN: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

Memorystream и FileStream - это потоки, используемые для работы с необработанной памятью и файлами соответственно...

Ответ 6

Поток - это просто абстракция (или оболочка) через поток байтов physical. Этот поток physical называется base stream. Таким образом, всегда существует базовый поток, по которому создается оболочка потока, и, таким образом, оболочка имеет имя после базового типа потока, то есть FileStream, MemoryStream и т.д.

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

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

Ответ 7

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

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

Ответ 8

Ну, вы можете как читать, так и писать в поток в большинстве случаев, memystream - это то, что вы можете объявить, чтобы вы могли работать с данными в памяти, а поток файлов - это поток, указывающий на файл, поэтому, когда вы напишите или прочитайте форму потока файлов, тогда вы читаете/записываете файл.