Какие классы позволяют ускорить чтение/запись за счет использования буфера?
Буферизованные потоки накапливают данные во внутреннем массиве (буфере) и выполняют операции ввода/вывода блоками, а не побайтно/посимвольно, что значительно сокращает количество системных вызовов.
Аналогия из жизни: без буфера — это как носить воду из колодца по одному стакану. С буфером — вы берёте ведро, наполняете его у колодца и затем используете воду из ведра, ходя к колодцу в разы реже.
Буферизованные классы
| Класс | Оборачивает | Конструкторы |
|---|---|---|
BufferedInputStream |
InputStream |
(InputStream in), (InputStream in, int size) |
BufferedOutputStream |
OutputStream |
(OutputStream out), (OutputStream out, int size) |
BufferedReader |
Reader |
(Reader in), (Reader in, int sz) |
BufferedWriter |
Writer |
(Writer out), (Writer out, int sz) |
Размер буфера по умолчанию — 8192 байт (8 КБ) для байтовых и 8192 символов для символьных потоков. Для файлов размером в несколько мегабайт и выше можно увеличить буфер до 32-64 КБ для повышения производительности.
BufferedReader добавляет метод readLine() для построчного чтения и lines() для получения Stream<String>. BufferedWriter добавляет метод newLine() для вставки платформо-зависимого символа перевода строки.
Важный нюанс
При использовании BufferedOutputStream или BufferedWriter данные могут оставаться в буфере и не быть записаны на диск. Для гарантии записи необходимо вызвать flush() или закрыть поток через close() (который вызывает flush() автоматически).
На собеседовании: назовите четыре буферизованных класса и поясните принцип — замена множества мелких системных вызовов одним крупным. Бонус — упомянуть размер буфера по умолчанию (8 КБ) и необходимость flush.