DOIFOR技术HttpServletResponse的输入输出流是否需要close或者flush
DOIFOR技术HttpServletResponse的输入输出流是否需要close或者flush

HttpServletResponse的输入输出流是否需要close或者flush

技术

是否需要执行close()方法?

一般来说你不需要关闭这个流。servlet容器在servlet结束后自动关闭这个流是servlet生命周期的一部分。

例如:如果你关闭了流且使用了过滤器,那么这个流可能会不可用。

总的来说,只要不重复使用流,就不会又什么问题。

文章:过滤器的要点

如果您想在servlet完成它的工作之后更改响应,那么应该创建一个扩展HttpServletResponseWrapper的包装器并缓冲输出。这是为了防止输出直接发送到客户机,同时在servlet关闭流时进行保护,如以下摘录所示(重点):

修改响应的过滤器通常必须在将响应返回到客户端之前捕获该响应。实现这一点的方法是将生成响应的servlet传递给代理流。代理流防止servlet在完成时关闭原始响应流,并允许过滤器修改servlet的响应。

实现自定义请求和响应

从Sun的官方文档中可以得出一个结论:关闭servlet的outputstream是常规操作,但不是必须要做的。

是否需要执行flush()方法?

不需要。servlet容器会自动调用flushclose,另外close方法会隐式调用flush

参见:《servlet3.1标准》 5.6节

5.6 Response对象的关闭

当一个response被关闭了,容器应该立即将该对象持有的内容缓存刷新到客户端。下面的事件表明servlet已经完成请求需要关闭响应:

  • servlet的服务方法的结束。
  • 响应的setContentLengthSetContentLengthLong方法中指定的内容量已大于零,并已写入响应。
  • 调用sendError方法。
  • 调用sendRedirect方法。
  • 调用AsyncContext上的完整方法。

在保持运行状态的servlet服务中调用flush通常只有在同一个流上有多个writer并且您想要切换writer的位置(例如,包含混合二进制/字符数据的文件)或者想要在不确定的时间内保持流指针打开(例如,日志文件)时才有用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注