在說BIO、NIO和AIO以前,先說說Java io流,先附上Java IO 流類結構思惟導體:java
Reader(字符讀取)、Writer(字符寫出)、InputStream(字節讀取)、OutputStream(字節寫出),編程
按操做對象分類思惟導圖:網絡
IO是指對數據流的輸入和輸出,也稱爲IO流,IO流主要分爲兩大類,字節流和字符流。字節流能夠處理任何類型的數據,如圖片,視頻等,字符流只能處理字符類型的數據,Java IO流設計到挺多類的,可是這些類實際上有必定的規律,批次之間的關係很是密切,Java IO流的40多個類都是由InputSteam/Reader和OutputStream/Writer派生出來的,因爲咱們主要介紹的是BIO、NIO以及AIO,Java IO流只是稍微的點到爲止,想詳細料瞭解能夠看看文章 來自Java技術前線關於Java IO流的介紹和總結,寫的很是仔細了!併發
我本身總結了一下:框架
BIO全稱是Blocking IO,是JDK1.4以前的傳統IO模型,自己是同步阻塞模式,針對網絡通訊都是一請求一應答的方式,雖然簡化了上層的應用開發,但在性能和可靠性方面存在着巨大瓶頸,試想一下若是每一個請求都須要新建一個線程來專門處理,那麼在高併發的場景下,機器資源很快就會被耗盡,固然,咱們能夠經過線程池來優化這種狀況,但即便是這樣,仍然改變不了阻塞IO的根本問題。異步
因爲BIO的缺點,致使Java在JDK1.0至JDK3.0中,網絡通訊模塊的性能一直是短板,因此不少人更傾向於使用C/C++開發高性能服務端。爲了強化Java在服務端的市場,終於在JSR-51也就是JDK4.0的時候發佈了Java NIO,能夠支持非阻塞IO。並新增了java.nio的包,提供不少異步開發的API和類庫,我本身對NIO作了簡單的總結:async
AIO是在NIO的基礎上,提供了異步操做(asynchronized)。AIO是在IO操做完成後,再給線程發送通知,AIO就是完成不阻塞的,經過一個回調函數,等待IO完成後使用,AIO提供了一個異步通道:AsynchronousSocketChannel,此類的方法簽名會有一個參數CompletionHandler,處理回調成功時或者失敗時的結果,我本身梳理了一下:函數
NIO提供了與傳統BIO模型中的 Socket 和 ServerSocket 相對應的 SocketChannel 和 ServerSocketChannel 兩種不一樣的套接字通道實現,兩種通道都支持阻塞和非阻塞兩種模式。阻塞模式使用就像傳統中的支持同樣,比較簡單,可是性能和可靠性都很差;非阻塞模式正好與之相反。對於低負載、低併發的應用程序,可使用同步阻塞I/O來提高開發速率和更好的維護性;對於高負載、高併發的(網絡)應用,應使用 NIO 的非阻塞模式來開發。高併發
爲了更好的理解BIO、NIO、AIO三者的區別,咱們下面介紹一下同步和異步、阻塞和非阻塞以及Reactor模型和Proactor模型的概念,我作了如下總結:性能
Reactor模型:
- 應用程序在事件分離器註冊 讀就緒事件 和 讀就緒事件處理器
- 事件分離器等待讀就緒事件發生
- 讀就緒事件發生,激活事件分離器,分離器調用 讀就緒事件處理器(即:能夠進行讀操做了,開始讀)
- 讀事件處理器開始進行讀操做,把讀到的數據提供給程序使用
Proactor模型
- 應用程序在事件分離器註冊 讀完成事件 和 讀完成事件處理器,並向操做系統發出異步讀請求
- 事件分離器等待操做系統完成讀取
- 在分離器等待過程當中,操做系統利用並行的內核線程執行實際的讀操做,並將結果數據存入用戶自定義緩衝區,最後通知事件分離器讀操做完成
- 事件分離器監聽到 讀完成事件 後,激活讀完成事件的處理器讀,讀完成事件處理器 處理用戶自定義緩衝區中的數據給應用程序使用
同步和異步的區別就在於 讀 操做由誰完成:同步的Reactor是指程序發出讀請求後,由分離器監聽到能夠進行讀操做時(須要得到讀操做條件)通知事件處理器進行讀操做,異步的Proactor是指程序發出讀請求後,操做系統馬上異步地進行讀操做了,讀完以後在通知分離器,分離器激活處理器直接取用已讀到的數據。
以上就是 Java網絡之BIO、NIO和AIO(一)的全部內容,本文主要介紹了Java裏面IO模型的演變和發展,介紹了他們的特色,在想了解和掌握一個知識的前提需須要對該知識點概念上的理解,這也是Java在服務端領域大放異彩的一個重要緣由,瞭解這些知識以後,咱們再去學習高性能的Netty框架,將會更加容易。,Java網絡之BIO、NIO和AIO(二)會對他們進行更深一步的介紹和實戰,到後面的文章咱們也會對 t-io 網絡編程框架作一個介紹,期待吧 !!!