我是否需要刷新 servlet 输出流?5.6 响应对象的闭包

2022-09-01 06:44:27

我是否需要从 HttpServletResponse 中“刷新”输出流?

我已经看到从 到 我应该关闭 servlet 输出流吗?我不需要关闭它,但不清楚我是否需要刷新它。我也应该从容器中期待它吗?

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?
}

答案 1

您不需要这样做。servlet容器将为您冲洗并关闭它。顺便说一句,收盘已经隐式调用了 flush。

另请参阅 Servlet 3.1 规范的第 5.6 章:

5.6 响应对象的闭包

关闭响应时,容器必须立即将响应缓冲区中的所有剩余内容刷新到客户端。以下事件指示 Servlet 已满足请求,并且要关闭响应对象:

  • 终止 servlet 的方法。service
  • 响应的 or 方法中指定的内容量大于零,并且已写入响应。setContentLengthsetContentLengthLong
  • 调用该方法。sendError
  • 调用该方法。sendRedirect
  • 调用 on 的方法。completeAsyncContext

在同一流上有多个写入器并且想要切换写入器(例如,具有混合二进制/字符数据的文件)或当您希望在不确定的时间内保持流指针打开(例如日志文件)时,调用 flush 通常才有用。


答案 2

猜猜您在其他问题中得到的相同答案在这里适用:如果它是您的流,请刷新并关闭它。否则,除非另有说明,否则流创建者应该这样做。


推荐