通過BufferedOutputStream或BufferedWriter 鏈接到底層流上來實現。因此,在寫
完數據時,flush就顯得尤為重要。
例如:
上圖中WEB服務器通過輸出流向客戶端響應了一個300字節的信息,但是,這時的輸出流有一個1024字節的緩沖區。所以,輸出流就一直等着WEB服務器繼續向客戶端響應信 息,當WEB服務器的響應信息把輸出流中的緩沖區填滿時,這時,輸出流才向WEB客戶端響應消息。
為了解決這種尷尬的局面,flush()方法出現了。flush()方法可以強迫輸出流(或緩沖的流)發送數據,即使此時緩沖區還沒有填滿,以此來打破這種死鎖的狀態。
當我們使用輸出流發送數據時,當數據不能填滿輸出流的緩沖區時,這時,數據就會被存儲在輸出流的緩沖區中。如果,我們這個時候調用關閉(close)輸出流,存儲在輸出流的緩沖區中的數據就會丟失。所以說,關閉(close)輸出流時,應先刷新(flush)換沖的輸出流,話句話說就是:“迫使所有緩沖的輸出數據被寫出到底層輸出流中”。
二.解讀flush()源碼:
下面以BufferedOutputStream類為例:
publicclass BufferedOutputStream extends FilterOutputStream { publicsynchronizedvoid flush() throws IOException { flushBuffer(); out.flush(); } privatevoid flushBuffer() throws IOException { if(count > 0) { out.write(buf, 0, count); count = 0; } } }
看到這里大家明白了吧,其實flush()也是通過out.write()將數據寫入底層輸出流的。