我应该关闭servlet输出流吗?

lee*_*roy 57 java servlets

可能重复:
是否应该在HttpServletResponse.getOutputStream()/.getWriter()上调用.close()?

我负责关闭HttpServletResponse.getOutputStream()(或getWriter()甚至输入流)还是应该将它留给容器?

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException {
    OutputStream o = response.getOutputStream();
    ... 
    o.close(); //yes/no ?
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 68

你确实不需要这样做.

Thumb规则:如果您没有自己创建/打开它new SomeOutputStream(),那么您不需要自己关闭它.如果它是例如a new FileOutputStream("c:/foo.txt"),那么你显然需要自己关闭它.

有些人仍然这样做的原因只是为了确保不再向反应机构写入任何内容.如果它会发生,那么这将导致IllegalStateExceptionappserver日志,但这不会影响客户端,因此客户端仍然得到正确的响应.这也是一个更容易的调试,以发现请求 - 响应链中的潜在问题,乍看之下您将看不到这些问题.例如,其他东西正在向链中更下方的响应主体追加更多数据.

您在初学者中看到的另一个原因是他们只是想阻止将更多数据写入响应主体.当JSP错误地在响应中扮演角色时,您经常会看到这种情况.他们只是忽略IllegalStateException日志中的s.不用说,这个特殊目的是坏的.


Jer*_*ond 9

不,你不需要关闭它.如果你这样做,你基本上会结束对客户的响应.关闭流后,在下一个请求之前,您无法向客户端发送任何其他内容.您没有打开流,因此您不必关闭它.