В чем отличие класса PrintWriter от PrintStream?
PrintWriter и PrintStream предоставляют похожий набор методов (print(), println(), printf()), но различаются по нескольким ключевым аспектам.
| Характеристика | PrintStream | PrintWriter |
|---|---|---|
| Работает с | байтами (OutputStream) | символами (Writer) |
| Поддержка Unicode | Ограниченная | Полная (корректная работа с символьными данными) |
| Автоматический flush | Всегда при println(), printf(), записи \n |
Только если включён в конструкторе (autoFlush = true) |
| Управление flush | Неявное | Явное через flush() или параметр конструктора |
| Примеры использования | System.out, System.err |
Запись в файлы, сетевые потоки, сервлеты |
PrintWriter усовершенствовал работу с символами Unicode, так как основан на Writer, который изначально проектировался для символьных данных. PrintStream сохранён в языке прежде всего ради обратной совместимости (System.out).
Оба класса никогда не выбрасывают исключения при записи — для проверки ошибок необходимо вызывать метод checkError(). Это удобно для логирования и вывода, но может маскировать ошибки записи, если не проверять явно.
В PrintWriter можно явно управлять буферизацией: при выключенном autoFlush данные накапливаются в буфере и записываются только при вызове flush() или при закрытии потока, что повышает производительность при записи большого объёма данных.
На собеседовании: ключевые отличия — PrintWriter работает с символами и поддерживает управление flush, PrintStream работает с байтами и всегда сбрасывает буфер при
println(). System.out — это PrintStream по историческим причинам.