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

Нужно ли мне очищать выходной поток сервлета?

Нужно ли "вымыть" 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?
}
4b9b3361

Ответ 1

Вам не нужно. Servletcontainer будет скрываться и закрывать его для вас. Закрытие кстати уже неявно вызывает флеш.

См. также главу 5.6 Спецификация сервлета 3.1:

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

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

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

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

Ответ 2

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

Ответ 3

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.