揭開Java IO流中的flush()的神祕面紗
阿新 • • 發佈:2019-01-11
前言:
大家在使用Java IO流中OutputStream、PrintWriter ……時,會經常用到它的flush()方法。
一.為什麼要flush:
與在網路硬體中快取一樣,流還可以在軟體中得到快取,即直接在Java程式碼中快取。這可以通過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()將資料寫入底層輸出流的。