可能重复:
Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?
我负责关闭HttpServletResponse.getOutputStream()(或getWriter()甚至输入流) 还是应该把它留在容器里?
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
OutputStream o = response.getOutputStream();
...
o.close(); //yes/no ?
}
答案 0 :(得分:65)
你确实不需要这样做。
Thumb规则:如果你没有使用new SomeOutputStream()
自己创建/打开它,那么你不需要自己关闭它。如果它是例如new FileOutputStream("c:/foo.txt")
,那么你显然需要自己关闭它。
有些人仍然这样做的原因只是确保不会再将任何内容写入响应正文。如果它会发生,那么这将在appserver日志中导致IllegalStateException
,但这不会影响客户端,因此客户端仍然会得到正确的响应。这也是一个更容易的调试,以发现请求 - 响应链中的潜在问题,乍看之下您将看不到这些问题。例如,其他东西会向链中更下方的响应主体追加更多数据。
您在初学者中看到的另一个原因是他们只是想阻止将更多数据写入响应正文。当JSP错误地在响应中扮演角色时,您经常会看到这种情况。他们只是忽略日志中的IllegalStateException
。不用说,这个特殊目的是坏。
答案 1 :(得分:8)
不,你不需要关闭它。如果你这样做,你基本上会结束对客户的响应。关闭流后,在下一个请求之前,您无法向客户端发送任何其他内容。您没有打开流,因此您不必关闭它。