Разница между буфером и потоком в С#

Я читал, что Buffer - это последовательность байтов. Но я также читал, что Stream - это также последовательность байтов. Так в чем же разница между Stream & Буфер?

Ответ 1

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

FileStream stream = new FileStream("filepath.txt", FileMode.OpenOrCreate);

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

Наоборот:

byte[] fileContents = File.ReadAllBytes("filepath.txt");

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

Впрочем, это просто объяснение. Там более тщательные, например, как Марк Гравелл говорит:

Многие структуры данных (списки, коллекции и т.д.) Действуют как контейнеры - они содержат набор объектов. Но не поток; если список представляет собой ведро, тогда поток представляет собой шланг. Вы можете извлекать данные из потока или вставлять данные в поток, но обычно только один раз и только в одном направлении (есть исключения, конечно). Например, данные TCP по сети являются потоком; вы можете отправлять (или получать) куски данных, но только в связи с другим компьютером и обычно только один раз - вы не можете перемотать Интернет.

Потоки также могут манипулировать данными, проходящими через них; потоки сжатия и т.д. Но опять же - основная метафора здесь - это шланги данных. Файл также обычно доступен (на некотором уровне) как поток; вы можете получить доступ к блокам последовательных данных. Конечно, большинство файловых систем также обеспечивают произвольный доступ, поэтому потоки предлагают такие вещи, как Seek, Position, Length и т.д., Но не все реализации поддерживают такие. У него нет смысла искать какие-то потоки или получить длину открытого сокета.

Ответ 2

Буфер имеет указанный размер/длину и используется для хранения данных. С другой стороны, Stream используется для чтения и записи информации из одного места в другое. Например, FileStream используется для чтения и записи в файлы и из них, в самом потоке есть буфер, буфер которого заполняется до максимального его размера, очищается и данные в потоке считываются или записываются.