標籤:緩衝 記憶體 jdk 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();
這樣列舉是不是對PrintWriter中的方法有有所理解了呢。那麼問題又來了,我們平時用的flush()和這裡的flush()是不是一樣的呢?這個就先思考一下
關於java中輸出資料流flush()方法