Можете ли вы объяснить концепцию streamов?

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

По какой-то причине эта концепция просто не нажимает на меня. Я прочитал кучу статей, но я думаю, что мне нужна аналогия или что-то еще.

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

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

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

int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); } // in another method: Stream fileStream = new FileStream("My Data.dat"); Stream zipStream = new ZipDecompressorStream(fileStream); Stream decryptedStream = new DecryptionStream(zipStream); StreamReader reader = new StreamReader(decryptedStream); int x = ReadInt(reader); 

Как вы видите, очень легко изменить исходный источник без изменения логики обработки. Например, чтобы читать данные из сетевого сокета вместо файла:

 Stream stream = new NetworkStream(mySocket); StreamReader reader = new StreamReader(stream); int x = ReadInt(reader); 

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

 public class RandomNumbersStreamReader : StreamReader { private Random random = new Random(); public String ReadLine() { return random.Next().ToString(); } } // and to call it: int x = ReadInt(new RandomNumbersStreamReader()); 

Видеть? Пока ваш метод не заботится о том, что источник входных данных, вы можете настроить свой источник различными способами. Абстракция позволяет отделить входные данные от логики обработки очень элегантным способом.

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

Итак, резюмируя, stream является всего лишь источником ввода, скрывая (абстрагируя) другой источник. Пока вы не нарушаете абстракцию, ваш код будет очень гибким.

Дело в том, что вам не нужно знать, что такое резервный магазин – это абстракция над ним. В самом деле, возможно, даже не будет хранилища резервных копий – вы можете читать из сети, и данные никогда не «сохраняются» вообще.

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

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

Точка streamа – это обеспечить слой абстракции между вами и хранилищем. Таким образом, данному блоку кода, который использует stream, не нужно, если хранилище резервных копий является файлом диска, памятью и т. Д. …

Речь идет не о streamах, а о плавании. Если вы можете плавать в одном streamе, вы можете плавать по любому Стриму, с которым вы сталкиваетесь.

Чтобы добавить в эхо-камеру, stream представляет собой абстракцию, поэтому вам не нужно заботиться о базовом магазине. Это имеет смысл, когда вы рассматриваете сценарии с streamами и без них.

Файлы неинтересны по большей части, потому что streamи не намного выше и выше того, что я не знал о методах, отличных от streamа. Начнем с интернет-файлов.

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

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

Таким образом, streamи облегчают ввод-вывод. Вы могли бы, конечно, написать class TcpFileDownloader, который делает то, что делает stream, но тогда у вас есть class, специфичный для TCP. Большинство интерфейсов streamов просто предоставляют метод Read () и Write (), и все более сложные концепции обрабатываются внутренней реализацией. Из-за этого вы можете использовать один и тот же базовый код для чтения или записи в память, файлы на диске, сокеты и многие другие хранилища данных.

Это просто концепция, еще один уровень абстракции, который облегчает вашу жизнь. И все они имеют общий интерфейс, что означает, что вы можете комбинировать их в такой же форме. Например, закодируйте на base64, затем запишите, а затем напишите это на диск и все в одной строке!

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

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

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

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

В-третьих, устройствам не требуется управлять инвентарем, боксом или распаковкой. Самый эффективный способ агрегирования и упаковки вещей изменчив: возможно, сегодня вы помещаете свои пирожные в коробки по 48 и отправляете их на грузовик, но завтра вы хотите отправить коробки из шести в ответ на заказные заказы. Такие изменения могут быть заменены путем замены или реконфигурации машин в начале и конце производственной линии; вишневая машина в середине линии не должна быть изменена для обработки различного количества элементов за раз, она всегда работает с одним элементом за раз, и ему не нужно знать, как ее вход или выход сгруппированы.

Лучшее объяснение streamов, которые я видел, – это глава 3 SICP . (Возможно, вам нужно будет прочитать первые 2 главы, чтобы это имело смысл, но вы все равно должны: .-)

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

  • Потоки задерживаются списками
  • Расчетные накладные расходы [жадно вычисляют все заблаговременно, в некоторых случаях] являются возмутительными
  • Мы можем использовать streamи для представления бесконечно длинных последовательностей

В информатике stream представляет собой непрерывный stream информации.

Когда я думаю о streamовой передаче, я думаю о службе доставки видеоданных. Хотя streamовая передача не ограничивается видео. Текстовые, аудио, zip-файлы также могут быть streamовыми. Кроме того, streamовая передача не ограничена файлами. Также могут транслироваться соединения HTTP, FTP, SSH и ввод / вывод.

Чтобы понять концепцию streamовой передачи, вы можете сравнить другие концепции распространения данных.

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

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

Потоковая передача происходит в режиме реального времени, а fragmentы данных. Потоковая передача осуществляется в прямом эфире. Клиенты, которые прослушивают широковещательную рассылку, не могут быстро пересылать или перематывать. В видеоstreamах данные отбрасываются после воспроизведения.

Потоковый сервер поддерживает двухстороннее соединение со своим клиентом, а веб-сервер закрывает соединение после ответа сервера.

Полезные ссылки:

  1. http://www.slideshare.net/auroraeosrose/writing-and-using-php-streams-and-sockets-zendcon-2011 Предоставляет очень четкую презентацию
  2. https://www.sk89q.com/2010/04/introduction-to-php-streams/
  3. http://www.netlingo.com/word/stream-or-streaming.php
  4. http://www.brainbell.com/tutorials/php/Using_PHP_Streams.htm
  5. http://www.sitepoint.com/php-streaming-output-buffering-explained/
  6. http://php.net/manual/en/wrappers.php
  7. http://www.digidata-lb.com/streaming/Streaming_Proposal.pdf
  8. http://www.webopedia.com/TERM/S/streaming.html
  9. http://php.net/manual/en/intro.stream.php
  10. https://en.wikipedia.org/wiki/Stream_%28computing%29

Другой момент (для чтения файловой ситуации):

  1. stream может позволить вам сделать что-то еще, прежде чем finished reading all content of the file .
  2. вы можете сохранить память, потому что не нужно сразу загружать все содержимое файла.

Подумайте о streamах как абстрактного источника данных (байты, символы и т. Д.). Они абстрагируют фактическую механику чтения и записи на конкретный источник данных, будь то сетевой сокет, файл на диске или ответ с веб-сервера.

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

Точка streamа – это то, что мы ограничиваем наше внимание тем, что важно. Имея стандартную абстракцию, мы можем выполнять общие операции. Даже если вы не хотите, например, искать файл или HTTP-ответ для URL-адресов сегодня, не означает, что вы не захотите завтра.

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

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

Например, если вы обрабатываете данные через stream, то это не имеет значения для вашего кода, если данные поступают из файла, сетевого подключения, строки, блоба в базе данных и т. Д. И т. Д. И т. Д.

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

Поток – это абстракция, которая предоставляет стандартный набор методов и свойств для взаимодействия с данными. Отвлекаясь от реального носителя, ваш код может быть написан без полной зависимости от того, что этот носитель является или даже реализует этот носитель.

Хорошей аналогией может быть рассмотрение сумки. Тебе все равно, из чего сделан мешок или что он делает, когда вкладываешь в него вещи, пока сумка выполняет работу в мешке, и ты можешь вернуть свои вещи. Поток определяет для носителей информации, что понятие сумки определяет для разных экземпляров сумки (например, мешок для мусора, сумочка, рюкзак и т. Д.) – правила взаимодействия.

Я буду держать это в курсе, я просто пропустил здесь слово:

Потоки – это очереди, которые обычно хранятся в буфере, содержащем любые данные.

(Теперь, поскольку мы все знаем, в каких очередях, нет необходимости объяснять это дальше).

  • Как перенаправить вывод Process Builder в строку?
  • Есть ли способ закрыть StreamWriter без закрытия BaseStream?
  • Должен ли я вызвать Close () или Dispose () для объектов streamа?
  • ReadAllLines для объекта Stream?
  • Могу ли я передать загрузку файла на S3 без заголовка содержимого?
  • Есть ли стандартный class даты / времени в C ++?
  • Как преобразовать InputStream в виртуальный файл
  • Чтение больших текстовых файлов с streamами в C #
  • Почему InputStream # read () возвращает int, а не байт?
  • Как конвертировать Reader в InputStream и Writer в OutputStream?
  • Как загрузить файл и сохранить его в Stream для дальнейшего просмотра с помощью C #?
  • Давайте будем гением компьютера.