我需要清空Servlet的输出流吗?

36

我需要从HttpServletResponse中“flush” OutputStream吗?

我已经看到Should I close the servlet outputstream?,说我不需要关闭它,但是不清楚是否需要刷新。我应该也期望容器会自动进行刷新吗?

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个回答

53
你不需要这样做。Servlet容器会为您刷新和关闭它。顺便说一下,close隐含地调用了flush。
另请参阅Servlet 3.1规范的第5.6章:
闭合响应对象
当关闭响应时,容器必须立即将响应缓冲区中的所有剩余内容刷新到客户端。以下事件表明servlet已满足请求并且响应对象将被关闭:
- servlet的service方法终止。 - 在响应中指定的内容量大于零并已写入响应的setContentLength或setContentLengthLong方法。 - 调用sendError方法。 - 调用sendRedirect方法。 - 在AsyncContext上调用complete方法。
在仍在运行servlet的service时调用flush通常只有在同一流上有多个写入者并且您想要切换写入者(例如包含混合二进制/字符数据的文件)或者当您想要保持流指针打开一个不确定的时间(例如日志文件)时才有益。

5

猜测你在其他问题中得到的答案同样适用于这里:如果它是你的流,请刷新并关闭它。否则,除非另有说明,否则应该由流创建者来执行此操作。


4
指出了一个反常的例外情况,即“无需刷新”的规则:使用IBM WebSphere应用程序服务器并使用响应Writer(而不是OutputStream)时,我发现必须将其刷新;否则,我的响应数据的最后一部分将丢失。我想IBM的HttpServletResponse类确实会刷新OutputStream,但对于Writer使用单独的缓冲区并不会刷新它。其他应用程序服务器似乎会这样做。

因此,如果您将响应数据发送到Writer中,则最好将其刷新。但是,刷新OutputStream是没有必要的。

(我本来想将此发布为评论,但缺乏声望。)


有人上面提到过,如果这是你的流,请刷新它,否则就不要刷新。如果我理解正确的话,那个帖子的规则在这里适用吗? - KANJICODER
2
@JMADISON:这个规则似乎适用于流,但不适用于基于该流的写入器。由于刷新除了可能影响吞吐量/性能外并没有什么害处,我建议对于HttpServletResponse输出写入器进行刷新,无论服务器类型如何。 - Renardo

-1
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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接