2012-11-10 98 views

回答

2

如果您一直使用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(); 
} 
+0

在getWriter()之後調用getOutputStream(),或者+反之亦然+將始終失敗。 – EJP

1

什麼叫之間的區別......

唯一顯著不同的是,第一個版本將工作無論你是寫/打算寫在文本或二進制模式的身體,而第二版本僅適用於二進制模式輸出。

這些方法是否會刷新相同的緩衝區?

由於javadocs沒有給出明確的答案,所以技術上它取決於實現。然而,在實踐中,對於大多數實現來說,答案可能是「是」,因爲很難想象具有單獨的緩衝區是有意義的。

有一個在javadoc的一些這方面的間接證據:

  • setBufferSize(int)的Javadoc說:「設置首選緩衝區大小爲響應的身體。」其含義是這個緩衝區與javadoc中提到的flushBuffer()中的「緩衝區」相同。

  • flushBuffer()的javadoc說:「對此方法的調用會自動提交響應,這意味着狀態碼和頭文件將被寫入。」 ......這與一切都有效的緩衝模型是一致的。

另外要注意的是,一個小服務程序可以看到實際,將其進一步向上插入所述過濾器鏈專用包裝的響應對象。這種包裝的行爲可能與javadoc(以及其他servlet規範)所說的不一致。


如果是這樣,你能不能給我如何實現此緩衝區的servlet容器管理的線索?

最好的辦法是看容器的源代碼。