2009-09-10 6 views
80

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

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

  • stream
  • read stream
  • write stream

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

+11

вы можете проверить http://stackoverflow.com/questions/507747/can-you-explain-the-concept-of-streams – Preets

+1

Возьмите массив байтов, а затем создайте для него оболочку ('Stream'), который предоставляет некоторые полезные методы, такие как чтение, запись и изменение позиции. Теперь вы можете создавать классы на основе их резервного хранилища (FileStream, MemoryStream), которые наследуют от «Потока» и основываются на этой функциональности на основе конкретного хранилища резервных копий. –

ответ

47

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

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

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

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

+3

Итак, если я правильно понимаю, поток содержит данные и ничего не делает с ним. Классы помощника и читателя могут обрабатывать данные в потоке (манипулировать)? – Martijn

+6

Нет, поток не является контейнером данных, он используется для передачи данных, например FileStream передает данные с байта [] в физический файл, NetworkStream передает байты [] по сокету. Классы чтения Writer являются вспомогательными классами для записи и чтения из потока, например StreamReader может использоваться для чтения из строки Stream, а не byte []. если вы укажете FileStream в качестве параметра, он будет считываться из файла, если NetworkStream из сокета. –

+0

дополнительно StreamReader и StreamWriter предназначены для чтения и записи потоков TEXT (символов). – 1c1cle

0

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

2

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

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

+0

Спасибо за ссылку. Мне понравилось: «Вы можете просматривать исходный код онлайн, загружать ссылку для автономного просмотра и проходить через источники (включая патчи и обновления) во время отладки». Эта функция предлагает новый уровень понимания. – David

3

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

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

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

1

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

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

15

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

+0

Хотелось бы увидеть пример того, что вы только что сказали «работайте с небольшими кусками». –

+2

Потоки хороши для небольших объемов данных. Если программист на C# хочет манипулировать содержимым файла, он/она должен использовать потоки, независимо от количества данных. Это же утверждение верно и для сетевых потоков. Конечно, если программист является кодированием, это язык более низкого уровня, такой как C, тогда можно писать символы или байты непосредственно на диск или сокет, но даже для небольшого количества данных это занимает много времени и более подвержено ошибка. – 1c1cle

40

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

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

2

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

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

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

Смежные вопросы