2011-01-20 2 views
9

Почему на экземпляре ServletResponse и getWriter() и getOutputStream() назвать нельзя?Сервлеты в java - и getWriter() и getOutputStream()

+0

Это могло бы помочь, если бы вы объяснили, почему вы хотели позвонить как в одном запросе сервлета. –

+0

Возможно, Abkutty не хочет звонить обоим, но Servlet, обработкой ошибок Servlet и некоторыми фильтрами, которые пытаются записать вывод, а не правильно координируют между собой, какой метод использовать. – Thilo

+0

Я подумал бы еще раз, почему вы хотите иметь оба. –

ответ

18

A дизайн решение. Writer и OutputStream поддерживают собственный буфер. Если вы создали один каждый, то их выход должен каким-то образом быть объединен. Возможно, но сложнее. Поэтому они решили, что вам нужно выбрать, хотите ли вы на основе символов или двоичный вывод.

+0

Так почему же getWriter() не возвращает оболочку на результат getOutputStream()? –

+0

Потому что если вы попытаетесь написать оба, вы испортите результат из-за несогласованной буферизации. Или вы спрашиваете, почему Writer не раскрывает двоичные методы вывода OutputStream? – Thilo

4

Как правило, это связано с тем, что getOutputStream() используется для записи двоичного содержимого, тогда как getWriter() используется для написания текстового контента. Было бы бессмысленно писать как в одном запросе сервлета - вы должны либо использовать один, либо другой.

12

Потому что Writer является абстракцией более высокого уровня, чем OutputStream. Он управляет кодировкой символов базового потока и включает свои собственные механизмы буферизации.

Если вы должны были написать прямо в OutputStream после использования Writer, существует высокий риск повреждения базового потока из-за смешанного кодирования символов или отсутствия буферизованных данных.

Чтобы предотвратить это смешение, API сервлета запрещает использование обоих для любого ответа.

Практически вы используете OutputStream для записи двоичного содержимого и Writer для написания текстового контента.

Смежные вопросы