是否需要执行close()
方法?
一般来说你不需要关闭这个流。servlet
容器在servlet
结束后自动关闭这个流是servlet
生命周期的一部分。
例如:如果你关闭了流且使用了过滤器,那么这个流可能会不可用。
总的来说,只要不重复使用流,就不会又什么问题。
文章:过滤器的要点
如果您想在servlet
完成它的工作之后更改响应,那么应该创建一个扩展HttpServletResponseWrapper
的包装器并缓冲输出。这是为了防止输出直接发送到客户机,同时在servlet
关闭流时进行保护,如以下摘录所示(重点):
修改响应的过滤器通常必须在将响应返回到客户端之前捕获该响应。实现这一点的方法是将生成响应的
servlet
传递给代理流。代理流防止servlet
在完成时关闭原始响应流,并允许过滤器修改servlet
的响应。
从Sun的官方文档中可以得出一个结论:关闭servlet的outputstream是常规操作,但不是必须要做的。
是否需要执行flush()
方法?
不需要。servlet容器会自动调用flush
和close
,另外close
方法会隐式调用flush
。
参见:《servlet3.1标准》 5.6节
5.6 Response对象的关闭
当一个
response
被关闭了,容器应该立即将该对象持有的内容缓存刷新到客户端。下面的事件表明servlet已经完成请求需要关闭响应:
servlet
的服务方法的结束。- 响应的
setContentLength
或SetContentLengthLong
方法中指定的内容量已大于零,并已写入响应。- 调用
sendError
方法。- 调用
sendRedirect
方法。- 调用
AsyncContext
上的完整方法。
在保持运行状态的servlet
服务中调用flush
通常只有在同一个流上有多个writer
并且您想要切换writer
的位置(例如,包含混合二进制/字符数据的文件)或者想要在不确定的时间内保持流指针打开(例如,日志文件)时才有用。