簡單理解IO

粗淺地理解IO

  寫本文只是爲了捋清楚java中IO的大概體系,不會涉及到具體用法。
  按照java發展歷程,剛開始只是提供了簡單的BIO。再後來,爲了提供更加豐富的IO操作,java提供了新包nio,在我理解,NIOnew IO的縮寫。衆所周知,linux的五種IO模型分別是阻塞IO、非阻塞IO、IO複用、信號驅動和異步IO,如果以上述五種模型爲基準,來對應nio包中各個io相關的類,可以發現java nio包中提供了非阻塞IO、IO複用、信號驅動和異步IO共四種類型的io。在linux中,這五種io模型是截然不同的,java io是對它們的一個包裝。
  因此,從linux的角度來看,NIO讀作new io。但是從java本身的角度來看,除了BIO,其它都是非阻塞的,所以又有人把NIO讀作no block io。
  那麼接着就引出一個問題,BIO中的stream和NIO中的channel怎麼理解,有什麼區別呢?本人竊以爲,starem(流)代表了磁頭一圈一圈地讀磁盤,每讀到一個字節就立即返回給上層。就像水管一樣,硬盤代表流入的一端,應用程序代表流出的一端,什麼時候流能夠結束,完全取決於流入的一端,上層應用只能等待。
  而channel就代表了一個具體的IO媒介、與它相關的一系列操作,和緩衝區。應用程序來讀取數據時,數據已經準備好,我們只需把數據寫入到自己的buffer中即可。但是它是怎麼讀取的,讀取的數據臨時存放在哪裏,如何與底層io交互,都已經封裝在channel中了。同理,寫入數據時只需把數據交給channel即可。
  聽起來NIO只是簡單地封裝linux中的IO模型。但是一旦瞭解NIO的用法,就會發現,它整合了多方面的東西,提供了許多高級特性(比如selector、scatter/gather、socket channel等),甚至自成體系,用起來方便至極。這與spring 的IOC實現非常相似,圍繞着反射這個核心,提供了一系列的高級容器,這樣才使它能夠算的上是一個成功的產品。
  以上是我對IO的粗淺理解,歡迎大家糾正。

附上一些資料供參考:
NIO用法
linux中的IO模型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章