Ответ 1
Как я уже сказал в своем комментарии, разница в ореховой скорлупе между буфером и потоком заключается в том, что поток представляет собой последовательность, которая передает информацию от или к указанному источнику, тогда как буфер представляет собой последовательность байтов, которая хранится в памяти. Например:
FileStream stream = new FileStream("filepath.txt", FileMode.OpenOrCreate);
Открывает поток в файл. Этот поток можно читать, записывать или или и тому и другому. Поскольку он не требует дополнительной памяти, он легкий и быстрый, но произвольно ссылающийся на конкретный набор данных в источнике может быть громоздким. Потоки также выигрывают от подключения, а не от дискретного набора данных, поэтому вам не нужно заранее знать размер данных.
Наоборот:
byte[] fileContents = File.ReadAllBytes("filepath.txt");
Считывает все байты файла в память. Это удобно, когда вам нужно сразу манипулировать всем файлом или сохранять "локальную копию" для вашей программы, чтобы файл мог быть бесплатным для других целей. Однако в зависимости от размера источника и объема доступной памяти буфер, содержащий весь файл, может быть не вариантом.
Впрочем, это просто объяснение. Там более тщательные, например, как Марк Гравелл говорит:
Многие структуры данных (списки, коллекции и т.д.) Действуют как контейнеры - они содержат набор объектов. Но не поток; если список представляет собой ведро, тогда поток представляет собой шланг. Вы можете извлекать данные из потока или вставлять данные в поток, но обычно только один раз и только в одном направлении (есть исключения, конечно). Например, данные TCP по сети являются потоком; вы можете отправлять (или получать) куски данных, но только в связи с другим компьютером и обычно только один раз - вы не можете перемотать Интернет.
Потоки также могут манипулировать данными, проходящими через них; потоки сжатия и т.д. Но опять же - основная метафора здесь - это шланги данных. Файл также обычно доступен (на некотором уровне) как поток; вы можете получить доступ к блокам последовательных данных. Конечно, большинство файловых систем также обеспечивают произвольный доступ, поэтому потоки предлагают такие вещи, как Seek, Position, Length и т.д., Но не все реализации поддерживают такие. У него нет смысла искать какие-то потоки или получить длину открытого сокета.