Сервлеты в Java - оба getWriter () и getOutputStream () - PullRequest
9 голосов
/ 20 января 2011

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

Ответы [ 3 ]

18 голосов
/ 20 января 2011

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

12 голосов
/ 20 января 2011

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

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

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

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

5 голосов
/ 20 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...