84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
java中,读取磁盘文件时,通常都使用BufferedInputStream包装FileInputStream。但是操作系统内核读取磁盘文件时,不是会将内存作为磁盘文件的缓冲区吗?那为什么还要在程序里自己使用缓冲区??
小伙看你根骨奇佳,潜力无限,来学PHP伐。
因為作業系統要將用戶空間和系統空間隔離呀, 以保護資料安全. 準確的說, 作業系統在讀取檔案的時候是將檔案讀入系統空間, 然後再拷貝給應用程式進程的使用者空間,也就是題主說的程式自己的緩衝區. 如果讓使用者進程直接作業系統空間的緩衝區, 作業系統豈不是不安全了.
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操作時,意義就體現出來了。
所謂的緩衝大多是有硬碟的硬體在介面區域封裝的,而且緩衝區也不大。作業系統是不會快取檔案內容到記憶體的。
因為你的硬碟不夠快!
因為作業系統要將用戶空間和系統空間隔離呀, 以保護資料安全. 準確的說, 作業系統在讀取檔案的時候是將檔案讀入系統空間, 然後再拷貝給應用程式進程的使用者空間,也就是題主說的程式自己的緩衝區. 如果讓使用者進程直接作業系統空間的緩衝區, 作業系統豈不是不安全了.
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操作時,意義就體現出來了。
所謂的緩衝大多是有硬碟的硬體在介面區域封裝的,而且緩衝區也不大。作業系統是不會快取檔案內容到記憶體的。
因為你的硬碟不夠快!