Основная идея любой буферизации - предоставить функцию для извлечения / хранения данных в чанках (например, чтение полной строки) и увеличения производительности.
Буферизация отличается от сокета или любого другого подобного API.Базовое устройство ввода (например, сокет) не должно знать о верхнем уровне буферизации.В то же время буферизация не делает различий, будь то базовый вход от клавиатуры или сокета или от любого другого устройства.Например, в случае использования Java класса BufferedReader базовый входной класс должен предоставлять некоторые интерфейсы, которые можно использовать, например, для чтения / записи данных в виде фрагментов символов или слов.
Итак, что здесь делает BufferedWriterхранить ваши данные, независимо от того, записаны они символьно или буквенно за словом, и очищать их (отправлять на устройство ввода, здесь сокет), когда явно вызывается flush, или передается '\ n', или объект уничтожается, или его буферзаполнен (скажем, maxlen составляет 1024 символа).
Аналогично, в случае BufferedReader, если вы читаете один символ из сокета, он внутренне пытается прочитать около 1024 символов и возвращает вам один символ.Для следующих операций чтения до 1024 символов он сохраняет предыдущие трудоемкие вызовы сокетов и быстро обслуживает их из своего внутреннего буфера чтения, пока он не станет пустым.
Вы можете легко реализовать те же классы Buffered в c ++, которые обертывают системный вызов сокета, обеспечиваяТочно такие же удобства для вас.Для буферизации вы можете использовать stdstream / stringstream std классы для чтения / записи строк, и вы поймете, как их использовать.