Что такое поток в мире программирования? Зачем нам это нужно?
Просьба объяснить с помощью аналогии, если это возможно.
Что такое поток в мире программирования? Зачем нам это нужно?
Просьба объяснить с помощью аналогии, если это возможно.
Поток представляет собой последовательность объектов (обычно байтов, но необязательно), к которым можно получить доступ в последовательном порядке. Типичные операции над потоком:
Конкретный поток может поддерживать чтение (в этом случае это "входной поток" ), запись ( "выходной поток" ) или и то, и другое. Не все потоки доступны для поиска.
Откат назад довольно редок, но вы всегда можете добавить его в поток, обернув реальный поток ввода в другом потоке ввода, который содержит внутренний буфер. Считывается из буфера, и если вы нажмете назад, данные будут помещены в буфер. Если в буфере нет ничего, тогда поток обратного потока читается из реального потока. Это простой пример "адаптера потока": он находится на "конце" входного потока, это сам входной поток, и он делает что-то дополнительное, что исходный поток не сделал.
Stream - полезная абстракция, потому что он может описывать файлы (которые действительно являются массивами, следовательно, поиск является простым), но также терминальный ввод/вывод (который не доступен для поиска, если не буферизирован), сокеты, последовательные порты и т.д. Таким образом, вы можете написать код, в котором говорится: "Я хочу некоторые данные, и мне все равно, откуда и от чего это получилось", или "Я создам некоторые данные, и это полностью зависит от моего вызывающего, что с ним происходит". Первый принимает параметр входного потока, последний принимает параметр выходного потока.
Лучшая аналогия, о которой я могу думать, это то, что поток - это конвейерный ленточный конвейер, идущий к вам или ведущий от вас (или иногда оба). Вы извлекаете материал из потока ввода, вы помещаете материал в выходной поток. Некоторые конвейеры, о которых вы можете думать, выходят из отверстия в стене - они не доступны для поиска, чтение или письмо - это одноразовая сделка. Некоторые конвейеры выложены перед вами, и вы можете двигаться по выбору места нахождения в потоке, который хотите читать/писать, - в поиске.
Как утверждает IRBMe, лучше всего думать о потоке с точки зрения операций, которые он предлагает (которые варьируются от реализации до реализации, но имеют много общего), а не по физической аналогии. Потоки - это "вещи, которые вы можете читать или писать". Когда вы начинаете подключать потоковые адаптеры, вы можете думать о них как о коробке с конвейером и конвейером, которую вы подключаете к другим потокам, а затем ящик выполняет некоторые преобразования данных (застегивая его или изменяя строки строк в UNIX к DOS, или что-то еще). Трубы - еще один тщательный тест метафоры: там, где вы создаете пару потоков, чтобы все, что вы пишете в одном, можно было читать из другого. Подумайте о червоточинах: -)
Поток уже является метафорой, аналогией, поэтому на самом деле нет необходимости подражать другому. Вы можете думать об этом в основном как о трубе с потоком воды в ней, где вода - это фактически данные, а труба - это поток. Я предполагаю, что это будет двухсторонняя труба, если поток двунаправлен. Это в основном общая абстракция, которая относится к вещам, где есть поток или последовательность данных в одном или обоих направлениях.
В таких языках, как С#, VB.Net, C++, Java и т.д., Метафора потока используется для многих вещей. Существуют потоки файлов, в которых вы открываете файл и можете читать из потока или записывать его непрерывно; Существуют сетевые потоки, в которых чтение и запись в поток считываются и записываются в базовое установленное сетевое соединение. Потоки для записи обычно называются выходными потоками, как в этом примере, и аналогично, потоки, которые предназначены только для чтения, называются входными потоками, как в этом примере.
Поток может выполнять преобразование или кодирование данных (например, SslStream в.Net, будет использовать данные согласования SSL и скрывать их от вас; TelnetStream может скрыть переговоры Telnet от вас, но предоставить доступ к данным; ZipOutputStream в Java позволяет записывать файлы в zip-архив, не беспокоясь о внутренностях формата zip файла.
Еще одна распространенная вещь, которую вы можете найти, это текстовые потоки, которые позволяют писать строки вместо байтов, или некоторые языки предоставляют двоичные потоки, которые позволяют писать примитивные типы. Обычная вещь, которую вы найдете в текстовых потоках, - это кодировка символов, о которой вы должны знать.
Некоторые потоки также поддерживают произвольный доступ, как в этом примере. С другой стороны, сетевой поток, по очевидным причинам, не будет.
Подобные операционные системы UNIX также поддерживают модель потока с входными и выходными данными программы, как описано здесь.
В дополнение к вещам, упомянутым выше, существуют разные типы потоков - как определено в языках функционального программирования, таких как Scheme или Haskell, - возможно, бесконечная структура данных, которая генерируется некоторой функцией по требованию.
Другая аналогия: вы не можете плавать против потока, поэтому вы можете просто взять следующий бит, байт, строку или объект из потока, а уже прочитанные данные будут удалены. Односторонний билет... или в основном просто очередь без сохранения сохранения.
Итак, нужны ли очереди? Вы решаете.
Слово "поток" выбрано потому, что оно представляет (в реальной жизни) очень похожее значение для того, что мы хотим передать, когда мы его используем.
Начните думать об аналогии с потоком воды. Вы получаете непрерывный поток данных, точно так же, как вода непрерывно течет в реке. Вы не всегда знаете, откуда берутся данные, и чаще всего вам это не нужно; будь то из файла, сокета или любого другого источника, это не важно (не обязательно). Это очень похоже на получение потока воды, в котором вам не нужно знать, откуда оно; будь то озеро, фонтан или какой-либо другой источник, это не важно (не обязательно). источник