Что означает стрим? Каковы его характеристики? - PullRequest
60 голосов
/ 28 февраля 2011

C ++ и C # оба используют слово stream для именования многих классов.

  • C ++ : iostream, istream, ostream, stringstream, ostream_iterator, istream_iterator ...
  • C # : Stream, FileStream, MemoryStream, BufferedStream ...

Так что мне стало любопытно узнать, что означает stream? Каковы характеристики stream? Когда я могу использовать этот термин для обозначения своих классов? Это ограничено только классами файлового ввода-вывода?

Интересно, что C нигде не использует это слово, насколько я знаю.

Ответы [ 5 ]

74 голосов
/ 28 февраля 2011

Многие структуры данных (списки, коллекции и т. Д.) Действуют как контейнеры - они содержат набор объектов.Но не поток;если список - это ведро, то поток - это шланг.Вы можете извлекать данные из потока или помещать данные в поток, но обычно только один раз и только в в одном направлении (конечно, есть исключения).Например, данные TCP по сети - это поток;Вы можете отправлять (или получать) порции данных, но только в соединении с другим компьютером, и обычно только один раз - вы не можете перематывать Интернет.

Потоки также могут манипулировать данными, проходящими через них;потоки сжатия, потоки шифрования и т. д. Но опять же - основная метафора здесь - поток данных.Файл также обычно доступен (на некотором уровне) как поток;Вы можете получить доступ к блокам последовательных данных.Конечно, большинство файловых систем также предоставляют произвольный доступ, поэтому потоки предлагают такие вещи, как Seek, Position, Length и т. Д., Но не все реализации поддерживают такие.Не имеет смысла искать несколько потоков или получать длину открытого сокета.

4 голосов
/ 28 февраля 2011

Есть несколько разных значений. # 1 - это то, что вы, вероятно, имеете в виду, но, возможно, вы захотите взглянуть и на # 2.

  1. В библиотеках, подобных тем, которые вы упомянули, «поток» - это просто абстракция для «двоичных данных», которые могут иметь или не иметь произвольный доступ (в отличие от данных, которые генерируются постоянно, например, если Вы писали поток, который генерировал случайные данные), или он может быть сохранен в любом месте (в ОЗУ, на жестком диске, по сети, в мозгу пользователя и т. д.). Они полезны, потому что позволяют избежать подробностей и написать общий код, который не заботится о конкретном источнике потока.

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

4 голосов
/ 28 февраля 2011

Из Потоки ввода / вывода (хотя в java значение то же самое в C ++ / C #)

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

Потоки поддерживают множество различных видов данных, в том числе простых байтов, примитивные типы данных, локализованные персонажи и предметы. Несколько потоков просто передать данные; другие манипулируют и преобразовать данные полезными способами.

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

В C # упомянутые вами потоки происходят от абстрактного базового класса Stream . Каждая реализация этого базового класса имеет определенную цель.

Например, FileStream поддерживает операции чтения / записи для файла, а MemoryStream работает с потоковым объектом в памяти. В отличие от классов FileStream и MemoryStream, класс BufferedStream позволяет пользователю буферизовать ввод / вывод.

В дополнение к вышеупомянутым классам есть несколько других классов, которые реализуют класс Stream. Полный список см. В документации MSDN по Stream классу.

2 голосов
/ 28 февраля 2011

За исключением официальных терминов и объяснений, само слово stream было взято из "реальной жизни" stream - вместо воды данные переносятся из одного места в другое.

Относительно вопроса, который вы задали, но до сих пор не ответили, вы можете назвать свои собственные классы в именах, которые содержат поток, но только если вы реализуете какой-то новый поток, он будет иметь правильное значение.

1 голос
/ 28 февраля 2011

В функциях C, определенных в <stdio.h>, работают с потоками.

В разделе 7.19.2 Потоки в C99 обсуждается, как они ведут себя, хотя и не являютсякроме «упорядоченной последовательности символов».

Объяснение дает больше контекста в соответствующем разделе, начиная с:

C унаследовал свое понятиетекстовые потоки из среды UNIX, в которой он родился.

Так вот откуда взялась концепция.

...