java - 是否应该在 HttpServletResponse.getOutputStream()/.getWriter() 上调用 .close()?

标签 java servlets outputstream

在 Java Servlet 中,可以通过 response.getOutputStream()response.getWriter() 访问响应正文。是否应该在写入此 OutputStream 后调用 .close()

一方面,Blochian 劝告总是关闭 OutputStreams。另一方面,我不认为在这种情况下存在需要关闭的底层资源。套接字的打开/关闭在 HTTP 级别进行管理,以允许诸如持久连接之类的事情。

最佳答案

通常您不应关闭流。作为 servlet 请求生命周期的一部分,servlet 容器将在 servlet 完成运行后自动关闭流。

例如,如果您关闭了流,如果您实现了 Filter,它将不可用。 .

说了这么多,如果你关闭它,只要你不尝试再次使用它,什么都不会发生。

编辑:another filter link

EDIT2:adrian.tarau 是正确的,如果你想在 servlet 完成它的事情后改变响应,你应该创建一个扩展 HttpServletResponseWrapper 的包装器并缓冲输出。这是为了防止输出直接发送到客户端,但也允许您保护 servlet 是否关闭流,根据以下摘录(强调我的):

A filter that modifies a response must usually capture the response before it is returned to the client. The way to do this is to pass the servlet that generates the response a stand-in stream. The stand-in stream prevents the servlet from closing the original response stream when it completes and allows the filter to modify the servlet's response.

Article

从那篇 Sun 官方文章中可以推断,从 servlet 中关闭 OutputStream 是正常现象,但不是强制性的。

关于java - 是否应该在 HttpServletResponse.getOutputStream()/.getWriter() 上调用 .close()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1159168/

相关文章:

java - LinkedListStack System.out.println

Java Hibernate Web 应用程序无法使用 MySQL 数据库显示数据

java - Opa:它如何识别服务器端或客户端脚本

java - 在 Cpanel Server 中部署多个 Tomcat 应用程序时的内存泄漏问题

java - 编辑二进制文件中的特定字节 - Java

java - 如何扩展Struts2 URLTag实现url安全

java - 是否可以将请求从 WebServlet 转发到休息助手 servlet (javax.ws.rs.core.Application)

java - 当带有数据的 POST 请求到达 Java Servlet 时读取 URL 参数

java - Android - 非 UI 线程渲染我的 UI 无响应

Java:如何将 OutputStream 上的文本格式化为用户控制台的宽度?