Вопрос

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

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

  • 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 считывает данные из сети и так далее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top