Ответы, данные до сих пор, превосходны. Я только предоставляю другой, чтобы подчеркнуть, что поток не является последовательностью байтов или специфичен для языка программирования, поскольку концепция универсальна (хотя ее реализация может быть уникальной). Я часто вижу в Интернете множество объяснений в терминах SQL, C или Java, которые имеют смысл, поскольку файловый поток имеет дело с областями памяти и операциями низкого уровня. Но они часто рассматривают, как создать файловый поток и работать с потенциальным файлом на их данном языке, а не обсуждать концепцию потока.
Метафора
Как уже упоминалось, stream
- это метафора, абстракция чего-то более сложного. Чтобы ваше воображение заработало, я предлагаю несколько других метафор:
- Вы хотите заполнить пустой бассейн водой. Один из способов сделать это - прикрепить шланг к патрубку, положить конец шланга в бассейн и включить воду.
шланг струйный
- Точно так же, если вы хотите заправить свой автомобиль газом, вы должны пойти к газовому насосу, вставить форсунку в бензобак и открыть клапан, нажав на фиксирующий рычаг.
шланг, форсунка и связанные с ними механизмы, позволяющие газу поступать в ваш бак - это поток
- если вам нужно добраться до работы, вы поедете из дома в офис по автостраде.
Автострада - это поток
- если вы хотите поговорить с кем-то, вы бы использовали слух, чтобы слышать, и рот, чтобы говорить.
ваши уши и глаза - потоки
Надеюсь, вы заметите в этих примерах, что метафоры потока существуют только для того, чтобы что-то проходило через него (или на нем в случае автострады), и не всегда сами представляют собой то, что переносят. Важное различие. Мы не называем наши уши как последовательность слов. Шланг остается шлангом, если через него не течет вода, но мы должны подсоединить его к патрубку, чтобы он правильно выполнял свою работу. Автомобиль - не единственный вид транспорта, способный пересечь автостраду.
Таким образом, может существовать поток, в котором нет данных, проходящих через него, если он подключен к файлу .
Удаление абстракции
Далее нам нужно ответить на несколько вопросов. Я собираюсь использовать файлы для описания потоков, так что ... Что такое файл? И как мы читаем файл? Я попытаюсь ответить на это, поддерживая определенный уровень абстракции, чтобы избежать ненужной сложности, и буду использовать концепцию файла относительно операционной системы Linux из-за ее простоты и доступности.
Что такое файл?
Файл является абстракцией:)
Или, насколько я могу объяснить, файл - это структура данных из одной части, описывающая файл, и данные из одной части, которые являются фактическим содержимым.
Часть структуры данных (называемая inode в системах UNIX / linux) идентифицирует важные фрагменты информации о контенте, но не включает в себя сам контент (или имя файла в этом отношении). Одна из частей информации, которую он хранит, - это адрес памяти, с которого начинается содержимое. Таким образом, с именем файла (или жесткой ссылкой в linux), дескриптором файла (числовое имя файла, о котором заботится операционная система) и начальной точкой в памяти, у нас есть нечто, что мы можем назвать файлом.
(ключевое слово «файл» определяется операционной системой, поскольку именно ОС в конечном итоге должна с этим справляться. И да, файлы намного сложнее).
Пока все хорошо. Но как нам получить содержимое файла, сказать любовное письмо вашему любимому, чтобы мы могли распечатать его?
Чтение файла
Если мы начнем с результата и двинемся назад, когда мы открываем файл на нашем компьютере, все его содержимое попадает на экран, чтобы мы могли его прочитать. Но как? Очень методично это ответ. Содержимое самого файла является другой структурой данных. Предположим, массив символов. Мы также можем думать об этом как о строке.
Так, как мы «читаем» эту строку? Находя его местоположение в памяти и перебирая наш массив символов, по одному символу за раз до достижения конца файла. Другими словами, программа.
Поток «создается», когда вызывается его программа, и он имеет область памяти для подключения к или подключения к . Как и в нашем примере с водяным шлангом, шланг неэффективен, если он не подсоединен к патрубку. В случае потока он должен быть подключен к файлу, чтобы он существовал.
Потоки могут быть дополнительно уточнены, например, поток для приема ввода или поток для отправки содержимого файлов на стандартный вывод. UNIX / linux соединяет и сохраняет открытыми 3 файловых потока для нас сразу, stdin (стандартный ввод), stdout (стандартный вывод) и stderr (стандартная ошибка). Потоки могут быть построены как сами структуры данных или объекты, что позволяет нам выполнять более сложные операции потоковой передачи данных через них, такие как открытие потока, закрытие потока или проверка ошибок файла, к которому подключен поток. C ++ cin
является примером объекта потока.
Конечно, если вы захотите, вы можете написать свой собственный поток.
Определение
Поток - это многократно используемый фрагмент кода, который абстрагируется от сложности работы с данными, обеспечивая при этом полезные операции для обработки данных.