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

Должен ли я закрывать выходной поток сервлета?

Возможный дубликат:
Должен ли один вызов .close() на HttpServletResponse.getOutputStream()/. getWriter()?

Я отвечаю за закрытие HttpServletResponse.getOutputStream() (или getWriter() или даже входной поток) или я должен оставить его в контейнере?

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException {
    OutputStream o = response.getOutputStream();
    ... 
    o.close(); //yes/no ?
}
4b9b3361

Ответ 1

Вам действительно не нужно это делать.

Правило большого пальца: если вы не создали/не открыли его самостоятельно, используя new SomeOutputStream(), вам не нужно его закрывать самостоятельно. Если это было, например, new FileOutputStream("c:/foo.txt"), вам, очевидно, нужно закрыть его самостоятельно.

Причины того, что некоторые люди все еще это делают, - это просто гарантировать, что больше ничего не будет написано в орган ответа. Если это произойдет, то это приведет к IllegalStateException в журналах приложений, но это не повлияет на клиента, поэтому клиент все равно получит правильный ответ. Это также более легкий отладчик, чтобы выявить потенциальные проблемы в цепочке запроса-ответа, которые вы не увидели бы на первый взгляд. Например, что-то еще добавляет больше данных в тело ответа где-то дальше в цепочке.

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

Ответ 2

Нет, вам не нужно закрывать его. Если вы делаете, вы в основном заканчиваете ответ клиенту. После закрытия потока вы не можете отправить что-либо еще клиенту до следующего запроса. Вы не открыли поток, поэтому вам не нужно его закрывать.