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

來源:互聯網
上載者:User

標籤:緩衝   記憶體   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()方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.