我正在通过调用response.getOutputStream()将二进制数据(从数据库中提取的CSV文件作为Clob)流式传输到浏览器,并且通常在复制数据时会将OutputStream封装在BufferedOutputStream中。
我应该关闭BufferedOutputStream还是这也会关闭底层的OutputStream?
[额外问题:在这种情况下,我需要使用BufferedOutputStream还是响应已经被缓冲了?]
我正在通过调用response.getOutputStream()将二进制数据(从数据库中提取的CSV文件作为Clob)流式传输到浏览器,并且通常在复制数据时会将OutputStream封装在BufferedOutputStream中。
我应该关闭BufferedOutputStream还是这也会关闭底层的OutputStream?
[额外问题:在这种情况下,我需要使用BufferedOutputStream还是响应已经被缓冲了?]
是的,它会关闭它。至于你是否应该关闭它-如果你不打算向响应流写入任何其他内容,那么我认为关闭它是可以的。如果你不关闭它,你显然应该刷新它-但我相信你自己可以想出这一点 :)
实际上,这种行为是从FilterOutputStream
继承而来的。对于FilterOutputStream.close
的Javadocs说明如下:
FilterOutputStream
的close方法调用其flush方法,然后调用其底层输出流的close方法。
至于你是否应该缓冲它-我不确定这是否被很好地定义了。它可能被埋藏在Servlet规范中的某个地方-甚至可能是可配置的(有时你确实不希望缓冲,但如果你可以缓冲整个响应,这意味着如果在你开始写作后出现问题,你可以提供一个更好的错误页面)。