Подтвердить что ты не робот

Необходимо ли закрыть входной поток, возвращаемый из HttpServletRequest?

У меня есть производственный код, который делает что-то вроде:

HttpServletRequest httpServletRequest
...
DataInputStream dis = new DataInputStream(httpServletRequest.getInputStream())

Эти потоки никогда не закрываются явно. Я предполагаю, что контейнер сервлетов управляет этим (JBOss Web). Каков правильный способ справиться с этим?

4b9b3361

Ответ 1

Правило большого пальца в I/O - это если вы не открываете/не создаете источник входного потока самостоятельно, вам необязательно также его закрывать. Здесь вы просто обертываете входной поток запроса, поэтому вам необязательно его закрывать.

Если вы открыли вход самостоятельно, например. new FileInputStream("c:/file.ext"), то вам, очевидно, нужно закрыть его в блоке finally. Контейнер должен делать это под капотом.

Ответ 2

Вы должны абсолютно не закрывать эти потоки самостоятельно, это задача контейнера. Выполнение этого вручную рискует помешать жизненному циклу запроса, и некоторые контейнеры могут яростно возражать против этого.

Ответ 3

Контейнер будет обрабатывать это. Всегда хороший стиль кодирования, чтобы закрыть ресурс в том же месте, где вы его разместили. (я был не прав в этом в моем исходном сообщении. Я думал, что вы открыли поток. p >

Ответ 4

Спецификация (до версии 3.0) не говорит (насколько я могу судить). В отсутствие канонической информации вы можете быть во власти реализации.

Исходный код ссылочной реализации указан на странице Sun Servlet:

Эталонная реализация включена в SDK Java EE 5, а также на сервер приложений Java Platform с открытым исходным кодом, Enterprise Edition (Java EE), доступный через проект GlassFish, на java.net. Исходный код эталонной реализации для технологии Servlet доступен из репозитория svn на java.net. Дополнительную информацию обо всех технологиях webtier в GlassFish можно найти на странице веб-сайта GlassFish.

Проверка поведения может быть как можно ближе к окончательному ответу, поскольку вы получите.