Java Response.getWriter()是否应该关闭/刷新它

Java Response.getWriter()是否应该关闭/刷新它,java,servlets,response,Java,Servlets,Response,当一个web应用程序被调用并输出到resonse.getWriter()时,这个PrintWriter不会被刷新或关闭 没有进一步的写入,所以我可能可以安全地刷新或关闭它。应用程序似乎在不关闭编写器的情况下运行良好,并且在org.apache.catalina.connector.CoyoteAdapter中确实调用了finishResponse()/finishRequest(),但这是tomcat的内部工作,依赖它似乎是错误的 关闭编写器似乎是错误的,因为我不确定是否确实使用response

当一个web应用程序被调用并输出到
resonse.getWriter()
时,这个
PrintWriter
不会被刷新或关闭

没有进一步的写入,所以我可能可以安全地刷新或关闭它。应用程序似乎在不关闭编写器的情况下运行良好,并且在
org.apache.catalina.connector.CoyoteAdapter
中确实调用了
finishResponse()/finishRequest()
,但这是tomcat的内部工作,依赖它似乎是错误的

关闭编写器似乎是错误的,因为我不确定是否确实使用
response.getWriter()
调用打开了编写器。(我想通常不会)

冲洗看起来更像是个好主意,但我确信这是否被认为是“正确”的方式


不执行任何刷新或关闭操作感觉在某些情况下可能会泄漏资源。

您不需要
flush()
close()
编写器

以下是Servlet 3.1规范的内容:

5.6响应对象的关闭 当响应关闭时,容器必须立即冲洗所有 客户端响应缓冲区中的剩余内容。以下 事件表示servlet已满足请求,并且 要关闭响应对象:

  • servlet服务方法的终止
  • 等等
由此我们可以推断,当服务方法返回或由于异常而终止时,应该刷新响应

我找不到任何明确声明您不需要
close()
响应编写器的内容。但是,由于web容器管理套接字,因此如果它在请求生命周期(或连接生命周期…如果使用持久连接)的某一点上不正确关闭它们,那就太疯狂了。因此,我认为可以安全地假设,如果忽略调用
close()
,就不会发生资源泄漏。(当然,没有精心设计的web容器。)



另一方面,如果您知道writer或output流是当前请求的响应流/writer,那么在请求处理结束时刷新和/或关闭servlet代码并没有坏处。

刷新和关闭是最佳实践,那么问题是什么?根据下面的答案,不需要这样做。但是,如果您正在执行一个可能写入不同类型的多路径servlet响应,那么如果您试图在关闭后写入,则使用close()将有助于调试。