JAX-RS提供StreamingOutput接口,我們可以實現原始流式傳輸響應主體。jax-rs用例中的StreamingOutput?
public interface StreamingOutput {
void write(OutputStream output)
}
我不確定他們爲什麼要構建一個接口來公開響應outputstream。爲什麼不直接注入OutputStream,我們可以直接寫入!
JAX-RS提供StreamingOutput接口,我們可以實現原始流式傳輸響應主體。jax-rs用例中的StreamingOutput?
public interface StreamingOutput {
void write(OutputStream output)
}
我不確定他們爲什麼要構建一個接口來公開響應outputstream。爲什麼不直接注入OutputStream,我們可以直接寫入!
在由Bill Burk(RESTEasy作者之一)編寫的書RESTful Java with JAX-RS 2.0中,您將找到關於StreamingOutput
的很好的解釋。
你問同樣的問題由作者回答說:
StreamingOutput
是當你想要做響應主體的原始數據流,你實現一個簡單的回調接口[...]你分配此接口的已實現實例並從JAX-RS資源方法返回它們。當JAX-RS運行時準備好寫入消息的響應正文時,將在
StreamingOutput
實例上調用write()
方法。 [...]您可能會問自己:「爲什麼不直接注入
OutputStream
?爲什麼有一個回調對象做流輸出?「這是一個很好的問題!擁有一個回調對象的原因是它給了JAX-RS的實現自由來處理輸出,但它想要的。出於性能原因,JAX-RS實現有時可能使用調用線程以外的其他線程來輸出響應。更重要的是,許多JAX-RS實現都有一個攔截器模型,它可以抽象出自動GZIP編碼或響應緩存。直接流式傳輸通常可以繞過這些架構結構。最後,Servlet 3.0規範引入了異步響應的概念。回調模型非常適合Servlet 3.0規範中的異步HTTP思想。
而且StreamingOutput
documentation規定如下:
這是一個輕量級替代一個MessageBodyWriter。