Нужно ли очищать выходной поток сервлета? - PullRequest
29 голосов
/ 18 февраля 2011

Нужно ли "очищать" OutputStream от HttpServletResponse?

Я уже видел от до Должен ли я закрыть выходной поток сервлета? , что мне не нужно его закрыватьно не ясно, нужно ли мне его промывать.Стоит ли ожидать этого от контейнера?

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException {
   byte[] response = getResponse();
   String responseType = getResponseType();

   response.setContentLength(response.length);
   response.setContentType(responseType);
   response.getOutputStream().write(response);
   response.getOutputStream().flush(); // yes/no/why?
}

Ответы [ 4 ]

48 голосов
/ 18 февраля 2011

Вам не нужно. Контейнер сервлета смоет и закроет его для вас. Закрытие, кстати, уже неявно вызывает сброс.

См. Также главу 5.6 спецификации Servlet 3.1 :

5.6 Закрытие объекта ответа

Когда ответ закрыт, контейнер должен немедленно очистить все оставшиеся содержимое в буфере ответа клиенту. Следующие события указывают, что сервлет удовлетворил запрос и что объект ответа должен быть закрыт:

  • Завершение метода service сервлета.
  • Количество содержимого, указанного в setContentLength или setContentLengthLong метод ответа был больше нуля и было написано в ответ.
  • Вызывается метод sendError.
  • Вызывается метод sendRedirect.
  • Вызван метод complete для AsyncContext.

Вызов flush во время работы службы сервлета обычно выгоден только тогда, когда у вас есть несколько пишущих в одном потоке, и вы хотите переключить писателя (например, файл со смешанными двоичными / символьными данными) или когда вы хотите сохранить указатель потока открыт в течение неопределенного времени (например, файл журнала).

3 голосов
/ 18 февраля 2011

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

1 голос
/ 12 февраля 2018

Чтобы указать на коварное исключение из правила «нет необходимости сбрасывать»: Работа с IBM WebSphere Application Server и использование ответа Writer (вместо OutputStream ), который я обнаружилчто мне пришлось его смыть;в противном случае последняя часть данных моего ответа была потеряна.Я полагаю, что класс IBM HttpServletResponse действительно очищает OutputStream , но использует отдельный буфер для Writer и не очищает его.Другие серверы приложений, похоже, делают это.

Так что, если вы отправляете свои данные ответов на Writer , безопаснее их сбросить.Но нет необходимости сбрасывать OutputStream в сделку.

(я бы написал это как комментарий, но мне не хватило бы репутации, чтобы это сделать).

0 голосов
/ 14 октября 2014
java.lang.Object
  extended byjava.io.Writer
      extended byjavax.servlet.jsp.JspWriter


close
public abstract void close()
                    throws IOException
Close the stream, flushing it first. 
This method needs not be invoked explicitly for the initial JspWriter as the code generated by the JSP container will automatically include a call to close(). 

Closing a previously-closed stream, unlike flush(), has no effect. 


Throws: 
IOException - If an I/O error occurs

============================

So, DO NOT close the output stream explicitly.
...