junior
В чем разница между PrintWriter и ServletOutputStream
PrintWriter — класс для работы с символьным потоком (text), а ServletOutputStream — для работы с байтовым потоком (binary). Выбор зависит от типа данных, которые отправляются клиенту.
| Критерий | PrintWriter | ServletOutputStream |
|---|---|---|
| Тип данных | Текстовые (HTML, JSON, XML) | Бинарные (изображения, PDF, файлы) |
| Получение | response.getWriter() |
response.getOutputStream() |
| Кодировка | Учитывает charset ответа |
Байты передаются «как есть» |
| Буферизация | Автоматическая буферизация символов | Работает с необработанными байтами |
PrintWriter автоматически конвертирует символы в байты с учётом заданной кодировки (response.setCharacterEncoding("UTF-8")). ServletOutputStream даёт полный контроль над байтами и используется для передачи файлов, изображений, потоковых данных.
На собеседовании: ключевой момент — нельзя вызывать оба метода для одного ответа. Попытка вызвать
getWriter()послеgetOutputStream()(или наоборот) приведёт кIllegalStateException.