天天看點

檔案的讀寫,java中的IO

  • java IO的進化史,java提供了io的操作類庫,使用流進行讀取和寫入。此時檔案的讀取寫入是同步阻塞的,即線程等待io操作完成,以進行下一步的操作。這時如果io操作太耗時,則造成了大量的浪費,此時線程就無法去做别的事,造成浪費。
  • 從記憶體方面來說,BIO(即同步阻塞IO)的流操作,在檔案讀取時從磁盤讀取到記憶體态,再從核心态空間讀取到使用者态空間。
  • 核心态空間:即指存儲作業系統和驅動程式等相關的程式運作的記憶體空間稱之為核心态空間。
  • 使用者态空間:使用者的應用,普通的服務使用的。舉個通俗的例子:比如我們的電腦有一個c盤,稱之為系統盤,系統盤一般隻建議存儲系統相關的應用軟體,其他的硬碟則存儲你需要安裝的其他軟體。這就是一個隔離,隔離的好處是互不影響,即你重裝系統也不影響你的應用的存儲。格式化系統盤重裝系統往往可以應對大部分的病毒,木馬。
    檔案的讀寫,java中的IO
  • 上邊的示意圖就是BIO的讀取和寫入。
  • BIO的好處是操作簡單,運作安全,沒有複雜的線程上下文切換,運作環境單一。
  • 自jdk1.4 java提供了NIO,這是一個同步非阻塞的IO操作,利用多路複用的思想,在IO進行時,該線程并不阻塞,可以繼續執行其他操作。比如這麼一個場景,一個請求過來進行一次IO,如果是阻塞的,那麼該請求就不會被線程處理,因為該線程處在阻塞狀态,如果是NIO,那麼多路複用的情況,它不會阻塞等待上一個IO的結果,那麼該次來的請求就會被同一個線程處理。這樣就實作了快速的響應,當其中一個IO完成,那麼線程就會去處理完成該IO 應該去做的事情。
  • 自jdk1.7 提供了AIO,即異步非阻塞IO,在多路複用的基礎上,利用時間回調,通知,大大提高了響應。 AIO線上程執行IO操作時,就可以傳回結果,不去等待。這也說明一個道理,如果你的結果不依賴IO的操作,利用AIO 是一個很好的做法,比如你就去讀一個檔案寫入伺服器,無論成功與否你都可以傳回成功。利用補償機制,當寫入失敗時進行補償操作,以保證寫入操作的正确性。
  • AIO操作完畢後,通知回調方法,去做一些事情。這樣就避免了等待,可以迅速傳回結果。比如與前台進行互動,這樣就可以大大提高程式的響應速度。
  • 三種IO 各有各的用途,不能一概而論,根據你的場景選擇合适的IO。