天天看點

解密Java IO流中的flush()方法的由來

​ 前言: 大家在使用Java IO流中OutputStream、PrintWriter ……時,會經常用到它的flush()方法。 一.為什麼要flush: 與在網絡硬體中緩存一樣,流還可以在軟體中得到緩存,即直接在Java代碼中緩存。這可以通過BufferedOutputStream或BufferedWriter 連結到底層流上來實作。是以,在寫 完資料時,flush就顯得尤為重要。

解密Java IO流中的flush()方法的由來
上圖中WEB伺服器通過輸出流向用戶端響應了一個300位元組的資訊,但是,這時的輸出流有一個1024位元組的緩沖區。是以,輸出流就一直等着WEB伺服器繼續向用戶端響應信 息,當WEB伺服器的響應資訊把輸出流中的緩沖區填滿時,這時,輸出流才向WEB用戶端響應消息。
為了解決這種尴尬的局面,flush()方法出現了。flush()方法可以強迫輸出流(或緩沖的流)發送資料,即使此時緩沖區還沒有填滿,以此來打破這種死鎖的狀态。
當我們使用輸出流發送資料時,當資料不能填滿輸出流的緩沖區時,這時,資料就會被存儲在輸出流的緩沖區中。如果,我們這個時候調用關閉(close)輸出流,存儲在輸出流的緩沖區中的資料就會丢失。是以說,關閉(close)輸出流時,應先重新整理(flush)換沖的輸出流,話句話說就是:“迫使所有緩沖的輸出資料被寫出到底層輸出流中”。      
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;
        }
     }
}