Что такое поток?

Что такое поток в мире программирования? Зачем нам это нужно?

Просьба объяснить с помощью аналогии, если это возможно.

Ответ 1

Поток представляет собой последовательность объектов (обычно байтов, но необязательно), к которым можно получить доступ в последовательном порядке. Типичные операции над потоком:

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

Конкретный поток может поддерживать чтение (в этом случае это "входной поток" ), запись ( "выходной поток" ) или и то, и другое. Не все потоки доступны для поиска.

Откат назад довольно редок, но вы всегда можете добавить его в поток, обернув реальный поток ввода в другом потоке ввода, который содержит внутренний буфер. Считывается из буфера, и если вы нажмете назад, данные будут помещены в буфер. Если в буфере нет ничего, тогда поток обратного потока читается из реального потока. Это простой пример "адаптера потока": он находится на "конце" входного потока, это сам входной поток, и он делает что-то дополнительное, что исходный поток не сделал.

Stream - полезная абстракция, потому что он может описывать файлы (которые действительно являются массивами, следовательно, поиск является простым), но также терминальный ввод/вывод (который не доступен для поиска, если не буферизирован), сокеты, последовательные порты и т.д. Таким образом, вы можете написать код, в котором говорится: "Я хочу некоторые данные, и мне все равно, откуда и от чего это получилось", или "Я создам некоторые данные, и это полностью зависит от моего вызывающего, что с ним происходит". Первый принимает параметр входного потока, последний принимает параметр выходного потока.

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

Как утверждает IRBMe, лучше всего думать о потоке с точки зрения операций, которые он предлагает (которые варьируются от реализации до реализации, но имеют много общего), а не по физической аналогии. Потоки - это "вещи, которые вы можете читать или писать". Когда вы начинаете подключать потоковые адаптеры, вы можете думать о них как о коробке с конвейером и конвейером, которую вы подключаете к другим потокам, а затем ящик выполняет некоторые преобразования данных (застегивая его или изменяя строки строк в UNIX к DOS, или что-то еще). Трубы - еще один тщательный тест метафоры: там, где вы создаете пару потоков, чтобы все, что вы пишете в одном, можно было читать из другого. Подумайте о червоточинах: -)

Ответ 2

Поток уже является метафорой, аналогией, поэтому на самом деле нет необходимости подражать другому. Вы можете думать об этом в основном как о трубе с потоком воды в ней, где вода - это фактически данные, а труба - это поток. Я предполагаю, что это будет двухсторонняя труба, если поток двунаправлен. Это в основном общая абстракция, которая относится к вещам, где есть поток или последовательность данных в одном или обоих направлениях.

В таких языках, как С#, VB.Net, C++, Java и т.д., Метафора потока используется для многих вещей. Существуют потоки файлов, в которых вы открываете файл и можете читать из потока или записывать его непрерывно; Существуют сетевые потоки, в которых чтение и запись в поток считываются и записываются в базовое установленное сетевое соединение. Потоки для записи обычно называются выходными потоками, как в этом примере, и аналогично, потоки, которые предназначены только для чтения, называются входными потоками, как в этом примере.

Поток может выполнять преобразование или кодирование данных (например, SslStream в.Net, будет использовать данные согласования SSL и скрывать их от вас; TelnetStream может скрыть переговоры Telnet от вас, но предоставить доступ к данным; ZipOutputStream в Java позволяет записывать файлы в zip-архив, не беспокоясь о внутренностях формата zip файла.

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

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

  • MSDN дает хороший обзор потоков в.Net.
  • Sun также имеет общий обзор своего общего класса OutputStream и класса InputStream.
  • В работе C++, здесь IStream (входной поток), ostream (выходной поток) и iostream (двунаправленный поток) документации.

Подобные операционные системы UNIX также поддерживают модель потока с входными и выходными данными программы, как описано здесь.

Ответ 3

В дополнение к вещам, упомянутым выше, существуют разные типы потоков - как определено в языках функционального программирования, таких как Scheme или Haskell, - возможно, бесконечная структура данных, которая генерируется некоторой функцией по требованию.

Ответ 4

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

Итак, нужны ли очереди? Вы решаете.

Ответ 5

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

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