write()方法和flush()的作用


馮諾依曼體系結構中,將計算機分為運算器,控制器,存儲器,輸入/輸出設備。

運算器,控制器是CPU的組成成分(還有一些寄存器)。

存儲器則可以分為內存儲器(內存)和外存儲器(硬盤),

輸入輸出設備主要來完成系統的I/O操作,I/O操作只要是對硬盤(外存)中的數據進行讀和取。

由於CPU的運算速度遠遠大於I/O操作,因此,當一個進程需要產生許多I/O操作,會耗費許多系統資源,同時也不利於進程之間的資源競爭,導致系統資源的利用率下降

由於CPU不能直接訪問外存(硬盤) ,需要借助內存來完成對硬盤中的數據的讀/取。想要完成此操作又不得不借助於I/O

JAVA的輸入/輸出流在默認情況下 ,是不被緩存區緩存的,

因此每發生一次read()和write()方法都需要請求操作系統再分發/接受一個字節,這樣運行效率必然會降低


發生read()/write()→→→等待操作系統分配內存資源→→→完成


相比之下,請求一個數據塊並將其置於緩沖區中會顯得更加高效。

我們可以將硬盤中的數據事先添加到預定義的范圍的緩沖池來預存數據,待CPU產生I/O操作時

可以從這個緩存池中來讀取數據,這樣減少了CPU的I/O的次數提高了程序的運行效率

JAVA也采用了這種方式。通過為基本流添加了處理流來減少I/O操作的次數


發生read()/write()→→→將內容存到緩沖區中→→→flush()沖刷出流將所有的緩存數據強行發送到目的地→→→完成

OutputStream/Writer中的方法:

    abstract void write(int n) 寫出一個字節的數據

    void write(byte[] b) 寫出所有字節到數組中

    void write(byte[] b,int off, int len) 寫出某個范圍的字節 到數組b中 b數據寫出的數組off第一個寫出字節在b中的偏移量len 寫出字節的最大數量

    void close() 沖刷並關閉輸出流

    void flush() 沖刷出流,將所有緩沖的數據強制發送到目的地


read()方法和write()是線程阻塞的,

也就是說,當某個線程試圖向另一端網絡節點讀取或寫入數據時,

有可能會發生網絡連接異常或者是服務器短期內沒有響應,這將會導致該線程阻塞,

同樣地,在無數據狀態進行讀取,數據已滿進行寫操作時,同樣會發生阻塞,

這時,其他線程搶占資源后繼續執行。

如果出現此現狀,讀取到緩沖池中的數據不能夠及時的發送到另一端的網絡節點,需要該線程再次競爭到CPU資源才可正常發送。

 

還有一種情況,當我們將數據預存到緩沖池中時,當數據的長度滿足緩沖池中的大小后,

才會將緩沖池中的數據成塊的發送,若數據的長度不滿足緩沖池中的大小,需要繼續存入,

待數據滿足預存大小后再成塊的發送。往往在發送文件過程中,文件末尾的數據大小不能滿足緩沖池的大小。

最終導致這部分的數據停留在緩沖池無法發送。


這時,就需要我們在write()方法后,手動調用flush()方法,強制刷出緩沖池中的數據,

(即使數據長度不滿足緩沖池的大小)從而保證數據的正常發送。

當然,當我們調用流的close()方法后,系統也會自動將輸出流緩沖區的數據刷出,同時可以保證流的物理資源被回收。


馮·諾依曼體系結構:

美籍匈牙利數學家馮·諾依曼於1946年提出存儲程序原理,把程序本身當作數據來對待,程序和該程序處理的數據用同樣的方式儲存。

馮·諾依曼體系結構馮·諾依曼理論的要點是:計算機的數制采用二進制;計算機應該按照程序順序執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM