我应该负责关闭HttpServletResponse.getOutputStream()(或getWriter()或什至inputstream),还是应该将其留给容器?protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { OutputStream o = response.getOutputStream(); ... o.close(); //yes/no ?}
2 回答

湖上湖
TA贡献2003条经验 获得超2个赞
您确实不需要这样做。
经验法则:如果您没有使用自己创建/打开它new SomeOutputStream()
,则不需要自己关闭它。例如new FileOutputStream("c:/foo.txt")
,如果它是一个,那么您显然需要自己关闭它。
有些人仍然这样做的原因仅仅是为了确保不会再将任何内容写入响应主体。如果发生这种情况,则将IllegalStateException
在appserver日志中导致,但这不会影响客户端,因此客户端仍会获得正确的响应。这也是一种较容易的调试,可以发现请求-响应链中的潜在问题,这些乍看之下不会发现。例如,其他事情正在将更多数据附加到响应主体,位于链的更下游。
在初学者中看到的另一个原因是,他们只是想防止更多数据写入响应主体。当JSP在响应中不正确地发挥作用时,您经常会看到这种情况。他们只是忽略IllegalStateException
日志中的。不用说,这个特定目的是有害的。

莫回无
TA贡献1865条经验 获得超7个赞
如果您打开了另一个InputStream对其进行包装,则可能要关闭该流,因为该容器将看不到包装流的可见性,包装流可能包含未提交的字节。理想情况下,如果它是BufferedOutputStream之类的,则只刷新()包装的数据流,但是我发现在使用CipherOutputStream时此类不会完全写入数据(在这种情况下,我有充分的理由相信)。在这种情况下,有必要调用close()以便客户端获得正确的响应。
添加回答
举报
0/150
提交
取消