1. 程式人生 > >關於java中輸出流flush()方法

關於java中輸出流flush()方法

在java開發中,有時我們會進行流的操作,所以可能會經常遇到這樣一段程式碼

out.flush();
out.close();

有時我們只是大概看懂這些,卻不知道其中的原理性東西,下面就來理解一下: flush()這個函式是清空的意思,用於清空緩衝區的資料流,進行流的操作時,資料先被讀到記憶體中,然後再用資料寫到檔案中,那麼當你資料讀完時,我們如果這時呼叫close()方法關閉讀寫流,這時就可能造成資料丟失,為什麼呢,因為,讀入資料完成時不代表寫入資料完成,一部分資料可能會留在快取區中,為了理解這個問題,我們舉一個例子:

比如,在農村,幾乎每家都有抽水機,抽水機的作用是什麼呢,就是把水井裡的水抽到水缸中,這時我們就會用水管連線抽水機和水缸(水管就好比是緩衝區),當我們想把水井中的水都抽到水缸中時,我們就讓抽水機工作抽水,如果我們發現水井裡的水剛好抽完時,我們就會關掉抽水機的開關停止抽水,那麼這時,管道里就會遺留一部分水,抽水就是讀資料,水缸進水就是寫資料,水管充當快取區的角色,不知道這樣是不是具象化了呢

那麼這樣一來我們如果中途呼叫close()方法,輸出區也還是有資料的,就像水缸裡有水,只是在緩衝區遺留了一部分,這時如果我們先呼叫flush()方法,就會強制把資料輸出,快取區就清空了,最後再關閉讀寫流呼叫close()就完成了。  

 public class PrintWriter extends Writer {
    protected Writer out;
/** Checks to make sure that the stream has not been closed */
    private void ensureOpen() throws IOException {
        if (out == null)
            throw new IOException("Stream closed");
    }
 
    /**
     * Flushes the stream.
     * @see #checkError()
     */
    public void flush() {
        try {
            synchronized (lock) {
                ensureOpen();
                out.flush();
            }
        }
        catch (IOException x) {
            trouble = true;
        }
    }
 
}

這是JDK中PrintWriter類提供的flush方法,如上面註釋所說,ensureOpen()方法是用於確保該流沒有被關閉,如果沒有關閉則執行flush方法中的out.flush();