Подтвердить что ты не робот

Что означает стрим? Каковы его характеристики?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

От потоки ввода-вывода (хотя в java значение в С++/С# равно)

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Итак, откуда приходит понятие.