Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该关闭servlet输出流吗?_Java_Servlets - Fatal编程技术网

Java 我应该关闭servlet输出流吗?

Java 我应该关闭servlet输出流吗?,java,servlets,Java,Servlets,可能重复: 我是否负责关闭HttpServletResponse.getOutputStream()(或getWriter()甚至inputstream) 或者我应该把它放在集装箱里 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { OutputStream o = response.getOu

可能重复:

我是否负责关闭HttpServletResponse.getOutputStream()(或getWriter()甚至inputstream) 或者我应该把它放在集装箱里

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

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

您确实不需要这样做

经验法则:如果您没有使用
newsomeoutputstream()
自己创建/打开它,那么您不需要自己关闭它。例如,如果它是一个
新文件输出流(“c:/foo.txt”)
,那么您显然需要自己关闭它

一些人仍然这样做的原因只是为了确保不会再向响应机构写入任何内容。如果发生这种情况,那么这将在appserver日志中导致
非法状态异常
,但这不会影响客户机,因此客户机仍然会得到正确的响应。这也是一种更容易的调试方法,可以发现请求-响应链中的潜在问题,而这些问题是您第一眼看不到的。例如,另一种方法是将更多的数据添加到链中较低位置的响应体中


您在启动器中看到的另一个原因是,他们只是想防止向响应体写入更多数据。当JSP错误地在响应中扮演角色时,您经常会看到这种情况。他们只是忽略日志中的非法状态异常。不用说,这种特殊用途是不好的。

如果您打开了另一个InputStream对其进行包装,则可能需要关闭该流,因为容器将无法看到包装流,包装流可能包含未提交的字节。理想情况下,如果包装流类似于BufferedOutputStream,则只需刷新()包装流,但我在使用CipheroOutputStream时发现,该类没有完全写入数据(我相信在这种情况下有充分的理由)。在这种情况下,需要调用close(),客户端才能得到正确的响应。