jax-rs用例中的流化输出?

jax-rs用例中的流化输出?,jax-rs,Jax Rs,JAX-RS提供了StreamingOutput接口,我们可以实现该接口来对响应体进行原始流处理 public interface StreamingOutput { void write(OutputStream output) } 我不知道他们为什么要构建一个接口来公开响应输出流。为什么不直接注入一个OutputStream,然后我们就可以简单地写入它了 在Bill Burk(RESTEasy的作者之一)写的书中,你会发现一个关于流化输出的很好的解释 作者回答了您提出的相同问题:

JAX-RS提供了StreamingOutput接口,我们可以实现该接口来对响应体进行原始流处理

public interface StreamingOutput {
    void write(OutputStream output)
}
我不知道他们为什么要构建一个接口来公开响应输出流。为什么不直接注入一个OutputStream,然后我们就可以简单地写入它了

在Bill Burk(RESTEasy的作者之一)写的书中,你会发现一个关于
流化输出的很好的解释

作者回答了您提出的相同问题:

StreamingOutput
是一个简单的回调接口,当您想要对响应主体进行原始流处理时,可以实现该接口[…]

分配此接口的已实现实例,并从JAX-RS资源方法返回它们。当JAX-RS运行时准备好写入消息的响应主体时,将在
StreamingOutput
实例上调用
write()
方法。[……]

您可能会问自己,“为什么不直接注入一个
OutputStream
?为什么有一个回调对象来进行流式输出?”这是一个好问题!拥有回调对象的原因是,它使JAX-RS实现可以自由地处理它想要的输出。出于性能原因,JAX-RS实现有时使用调用线程以外的其他线程来输出响应可能是有益的。更重要的是,许多JAX-RS实现都有一个拦截器模型,可以抽象出自动GZIP编码或响应缓存等内容。直接流通常可以绕过这些体系结构构造。最后,Servlet3.0规范引入了异步响应的思想。回调模型非常适合Servlet3.0规范中异步HTTP的思想

流化输出
说明如下:

这是一个轻量级的替代方案