java - 在程序里读取磁盘文件时,为什么需要使用缓冲区。
伊谢尔伦
伊谢尔伦 2017-04-17 17:44:56
0
6
971

java中,读取磁盘文件时,通常都使用BufferedInputStream包装FileInputStream。
但是操作系统内核读取磁盘文件时,不是会将内存作为磁盘文件的缓冲区吗?
那为什么还要在程序里自己使用缓冲区??

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(6)
Peter_Zhu

因為作業系統要將用戶空間和系統空間隔離呀, 以保護資料安全. 準確的說, 作業系統在讀取檔案的時候是將檔案讀入系統空間, 然後再拷貝給應用程式進程的使用者空間,也就是題主說的程式自己的緩衝區. 如果讓使用者進程直接作業系統空間的緩衝區, 作業系統豈不是不安全了.

伊谢尔伦

FileInputStream/FileOutputStream 每次呼叫 read()/write() 都會觸發一個 IO 操作。
BufferedInputStream/BufferedOutputSteam 呼叫read()/write() 並不會每次都觸發一個IO 操作,只是寫到內部的buffer裡面,而只有內部的buffer 滿了或​​者調用flush() 才會觸發IO操作。

IO 操作越少,效能越好。

小葫芦

做IO時JVM會在自己堆空間創建byte數組做buffer,一般用戶不能夠透過jvm直接呼叫記憶體(directbuffer)除外,堆空間buffer和記憶體互動由JVM管理。這樣才能利用JVM優勢,例如GC機制,以及java高層封裝的API。

洪涛

作業系統不僅會將硬碟上的檔案讀到記憶體當作快取使用,也會在記憶體開闢另外一段空間給記憶體的資料做快取處理。
意義何在? 為了管理,也為了效率。
記憶體與記憶體之間的資料交換,比記憶體與硬碟之間的資料交換速率高了兩個數量級。
當記憶體上的某個進程需要數據的時候,如果記憶體快取有匹配的數據,則直接在快取區取,
如果沒有,再去硬碟上讀。 (寫也同理)

Java為IO操作設計快取的意義,也是於此,
不同的地方在於Java快取的資料只能被Java的目前運作環境所使用。
與頻繁得去跟操作系統的快取拿資料相比,這提高了執行效率,
尤其是你的程式碼需要進行頻繁的IO操作時,意義就體現出來了。

小葫芦

所謂的緩衝大多是有硬碟的硬體在介面區域封裝的,而且緩衝區也不大。作業系統是不會快取檔案內容到記憶體的。

巴扎黑

因為你的硬碟不夠快!

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!