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



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



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

642   5  

5 ответов:

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

  • читать один байт. Следующий раз, когда вы читаете, вы получите следующий байт, и так далее.
  • чтение нескольких байтов из потока в массив
  • seek (переместить текущую позицию в потоке, так что в следующий раз, когда вы читаете вы получаете байты из новой позиции)
  • написать байт
  • записать несколько байтов из массива в поток
  • пропустить байты из потока (это похоже на чтение, но вы игнорируете данные. Или, если вы предпочитаете, это похоже на поиск, но может идти только вперед.)
  • push back bytes into A input stream (это похоже на "undo" для чтения - вы вставляете несколько байтов обратно в поток, так что в следующий раз, когда вы читаете, это то, что вы увидите. Это иногда полезно для парсеров, как это:
  • peek (посмотрите на байты, не читая их, так что они все еще там в потоке, чтобы прочитать позже)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Так нам нужны очереди? Вы сами решаете.

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

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

Comments

    Ничего не найдено.