java - 关闭 BufferedOutputStream 是否也会关闭底层的 OutputStream?

标签 java servlets jakarta-ee

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

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

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

最佳答案

是的,它关闭了它。至于您是否应该关闭它——您是否希望向响应流写入任何其他内容?如果没有,我认为关闭它就可以了。如果你不关闭它,你显然应该冲洗它 - 但我怀疑你可以自己解决这个问题:)

该行为实际上继承自FilterOutputStreamFilterOutputStream.close 状态的 Javadocs:

The close method of FilterOutputStream calls its flush method, and then calls the close method of its underlying output stream.

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

关于java - 关闭 BufferedOutputStream 是否也会关闭底层的 OutputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1428118/

相关文章:

jakarta-ee - 在类库中使用@Inject 注入(inject)EJB

hibernate - 可能的错误 : Hibernate 4. 3.5 @Lob 注释在用于字段时在 Postgres 中不起作用

java - 如何用OpenCV 3.0编写视频

Java : In ConcurrentHashMap , 如果我更改 key ,为什么会有不同的输出

java - Android - 获取昵称和昵称类型

java - IOUtils.copy 第二次失败

java - This() 与 Target() 方面

java - package.Class 不是 Servlet (Tomcat/J2EE)

javascript - 在 Javascript 加载之前,如何将系统信息从属性文件加载到 JSP 中?

java - Jackson将java组合序列化为json