什麼叫之間的區別:res.flushBuffer()vs res.getOutputStream()。flush();
res.flushBuffer();
與
res.getOutputStream().flush();
做這些方法刷新相同的緩衝?
如果是這樣,你能給我一個關於這個緩衝區如何由servlet容器管理的線索嗎?
什麼叫之間的區別:res.flushBuffer()vs res.getOutputStream()。flush();
res.flushBuffer();
與
res.getOutputStream().flush();
做這些方法刷新相同的緩衝?
如果是這樣,你能給我一個關於這個緩衝區如何由servlet容器管理的線索嗎?
如果您一直使用getOutputStream
寫入正文,它們會刷新相同的緩衝區。對於非二進制數據,另一種選擇是getWriter
。如果你一直在使用它,那麼調用res.getOutputStream().flush();
可能不起作用。
緩衝區的管理方式是特定於實現的,但是採取one of the Tomcat implementations for example。你可以看到,有一些像這樣的領域:
/**
* The associated output buffer.
*/
protected OutputBuffer outputBuffer;
/**
* The associated output stream.
*/
protected CoyoteOutputStream outputStream;
/**
* The associated writer.
*/
protected CoyoteWriter writer;
調用getOutputStream()
創建一個使用outputBuffer
字段顯示存在,同樣也getWriter()
一個CoyoteOutputStream
。所以他們都會使用outputBuffer
,這取決於你使用的是哪一個。 flushBuffer
乾脆這樣做:
@Override
public void flushBuffer()
throws IOException {
outputBuffer.flush();
}
在getWriter()之後調用getOutputStream(),或者+反之亦然+將始終失敗。 – EJP
什麼叫之間的區別......
唯一顯著不同的是,第一個版本將工作無論你是寫/打算寫在文本或二進制模式的身體,而第二版本僅適用於二進制模式輸出。
這些方法是否會刷新相同的緩衝區?
由於javadocs沒有給出明確的答案,所以技術上它取決於實現。然而,在實踐中,對於大多數實現來說,答案可能是「是」,因爲很難想象具有單獨的緩衝區是有意義的。
有一個在javadoc的一些這方面的間接證據:
爲setBufferSize(int)
的Javadoc說:「設置首選緩衝區大小爲響應的身體。」其含義是這個緩衝區與javadoc中提到的flushBuffer()
中的「緩衝區」相同。
flushBuffer()
的javadoc說:「對此方法的調用會自動提交響應,這意味着狀態碼和頭文件將被寫入。」 ......這與一切都有效的緩衝模型是一致的。
另外要注意的是,一個小服務程序可以看到實際是,將其進一步向上插入所述過濾器鏈專用包裝的響應對象。這種包裝的行爲可能與javadoc(以及其他servlet規範)所說的不一致。
如果是這樣,你能不能給我如何實現此緩衝區的servlet容器管理的線索?
最好的辦法是看容器的源代碼。
什麼是水庫的類型? – PermGenError
我正在談論Java servlet,所以類是HttpServletResponse – GionJh