關於java中輸出流flush()方法
阿新 • • 發佈:2018-12-20
在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();