搜尋

首頁  >  問答  >  主體

java - 在程序里读取磁盘文件时,为什么需要使用缓冲区。

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

伊谢尔伦伊谢尔伦2858 天前1027

全部回覆(6)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 17:46:56

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

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:46:56

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

    IO 操作越少,效能越好。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 17:46:56

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

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 17:46:56

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

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

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 17:46:56

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

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:46:56

    因為你的硬碟不夠快!

    回覆
    0
  • 取消回覆