1. 程式人生 > >揭開Java IO流中的flush()的神祕面紗

揭開Java IO流中的flush()的神祕面紗

前言:

   大家在使用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()將資料寫入底層輸出流的。