【发布时间】:2014-09-23 07:27:40
【问题描述】:
我知道关闭或不关闭ServletOutputStream 就像这里:Should I close the servlet outputstream? 或这里:Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()? 或这里的另一个焦点:Do I need to flush the servlet outputstream?
普遍的共识似乎是不关闭它,因为从更严格的意义上说,您并没有拥有它。 (HttpServletResponse 拥有它。)
但是例如呢?这些结构:
PrintWriter out = new PrintWriter(new OutputStreamWriter(resp.getOutputStream(), MY.ENCODING));
现在我显然是 PrintWriter 的所有者,它有一些额外的缓冲区,至少需要刷新(并且例如通过关闭它来刷新)。
这里的普遍共识是什么?我是否需要关闭PrintWriter(或与此相关的任何其他此类构造。)?
编辑:也有关闭流的有效参数。值得注意的例如不想要在流上写其他东西。同时,我们有 try-with-resource 构造,它可能 改变了画面。在这里查看我的另一个问题:Eclipse complaining over resource leak when not closing ServletOutputStream 这可能不会改变任何东西(我的总体感觉是也不要关闭流),但 try-with-resource 最重要的是,代码如下:
try( Something out = new Something( resp.getOutputStream() ) ){
out.print( "Foo" );
}
而不是
Something out;
try {
out = new Something( resp.getOutputStream() );
out.print( "Foo" )
} finally {
if( out != null && out.isUnFlushedWhatever() ) out.flush();
}
【问题讨论】:
-
如果你同意普遍的共识,知道关闭 PrintWriter 将关闭根据共识应该保持打开的底层响应流,并且知道实际需要做的是刷新,不要没有你想要的答案吗?
-
@jb:是也不是。这也是我的想法,但不关闭 ServletOutputStream 并不是一个明确的案例,以至于抛出一些额外的参数无法改变它。特别是像
try-with-resource这样的结构现在可能会改变平衡。 -
OutputStreamWriter委托给StreamEncoder,这可能会在关闭时做额外的工作。所以 IMO,它需要关闭。
标签: java servlets outputstream