Необходимо ли закрыть входной поток, возвращаемый из HttpServletRequest? - PullRequest
18 голосов
/ 27 ноября 2009

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

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

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

Ответы [ 4 ]

27 голосов
/ 27 ноября 2009

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

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

9 голосов
/ 27 ноября 2009

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

3 голосов
/ 27 ноября 2009

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

0 голосов
/ 27 ноября 2009

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

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

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

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

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