JAX-RS提供了StreamingOutput接口,我们可以实现这个接口来做我们的响应主体的原始流。
public interface StreamingOutput {
void write(OutputStream output)
}
我不确定他们为什么要构建一个接口来公开响应输出流。为什么不直接注入一个OutputStream,我们可以简单地写一下!!
答案 0 :(得分:2)
在Bill Burk(RESTEasy的一位作者)撰写的书RESTful Java with JAX-RS 2.0中,您会找到关于StreamingOutput
的一个很好的解释。
作者回答了您提出的同样问题:
StreamingOutput
是一个简单的回调接口,当您想要对响应主体进行原始流式传输时实现[...]您分配此接口的已实现实例,并从JAX-RS资源方法返回它们。当JAX-RS运行时准备好编写消息的响应主体时,将在
write()
实例上调用StreamingOutput
方法。 [...]您可能会问自己,“为什么不直接注入
OutputStream
?为什么有一个回调对象来做流输出?“这是一个很好的问题!拥有回调对象的原因在于它为JAX-RS实现提供了自由处理它想要的输出。出于性能原因,JAX-RS实现有时可能有利于使用调用线程以外的其他线程来输出响应。更重要的是,许多JAX-RS实现都有一个拦截器模型,可以像自动GZIP编码或响应缓存一样抽象出来。直接流式传输通常可以绕过这些架构结构。最后,Servlet 3.0规范引入了异步响应的思想。回调模型非常适合Servlet 3.0规范中异步HTTP的思想。
StreamingOutput
documentation声明如下:
这是MessageBodyWriter的轻量级替代品。