Gymterview
middle

В чем отличие класса 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 по историческим причинам.