我应该关闭 servlet 输出流吗?

2022-08-31 16:25:54

可能的重复:
是否应该在 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 ?
}

答案 1

你确实不需要这样做。

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

有些人仍然这样做的原因只是为了确保不会再写到响应机构中。如果发生这种情况,那么这将导致应用程序服务器日志中的一个,但这不会影响客户端,因此客户端仍然会得到正确的响应。这也是一个更容易的调试,可以发现请求 - 响应链中您乍一看看不到的潜在问题。例如,其他内容正在将更多数据追加到响应正文的链中更深处的某个位置。IllegalStateException

您在初学者中看到的另一个原因是,他们只是想防止将更多数据写入响应正文。当 JSP 错误地在响应中发挥作用时,您经常会看到这种情况。他们只是忽略日志中的 s。不用说,这个特殊目的很糟糕IllegalStateException


答案 2

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


推荐