关闭BufferedOutputStream会同时关闭底层的OutputStream吗?

14

我正在通过调用response.getOutputStream()将二进制数据(从数据库中提取的CSV文件作为Clob)流式传输到浏览器,并且通常在复制数据时会将OutputStream封装在BufferedOutputStream中。

我应该关闭BufferedOutputStream还是这也会关闭底层的OutputStream?

[额外问题:在这种情况下,我需要使用BufferedOutputStream还是响应已经被缓冲了?]

2个回答

14

是的,它会关闭它。至于你是否应该关闭它-如果你不打算向响应流写入任何其他内容,那么我认为关闭它是可以的。如果你不关闭它,你显然应该刷新它-但我相信你自己可以想出这一点 :)

实际上,这种行为是从FilterOutputStream继承而来的。对于FilterOutputStream.close的Javadocs说明如下:

FilterOutputStream的close方法调用其flush方法,然后调用其底层输出流的close方法。

至于你是否应该缓冲它-我不确定这是否被很好地定义了。它可能被埋藏在Servlet规范中的某个地方-甚至可能是可配置的(有时你确实不希望缓冲,但如果你可以缓冲整个响应,这意味着如果在你开始写作后出现问题,你可以提供一个更好的错误页面)。


5
关闭BufferedOutputStream也会关闭底层的OutputStream。您应该关闭BufferedOutputStream,以便在关闭底层流之前刷新其内容。请查看FilterOutputStream.close()的实现(从中扩展了BufferedOutputStream)以使自己信服。
我猜想,给您的servlet的响应流是否缓冲取决于您的Servlet容器的实现。就我所知,Tomcat默认会缓冲其servlet响应流,以尝试设置content-length HTTP标头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接