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