一、NIO原理
1、緩衝區
緩衝區其實就是一個數組,讀取和寫入都會用到緩衝器。最常用的就是ByteBuffer
2、通道
通道傳輸的數據是基於緩衝區的,不能直接對通道就行寫或讀的操作。通道和流的不同之處通道是雙向的。
當讀或寫的事件發生時,可以從Selector獲取SelectionKey,同時從key中找到發生的事件和具體的selectableChannel`
3、選擇器
selector類似一個觀察者,當有事件發生的時候,它會通知,傳回一組selectionKey,從而定位到通道,獲取數據。
selector原理是對註冊的key進行輪詢訪問,當有事件發生的時候,就會通過Selector.select()方法進行獲取事件
二、NIO與IO的區別
1、面向不同
IO是面向流的,當開始讀取數據的時候,每次可以讀取1個或者多個字節,直至讀取完畢。之後不能移動前後的數據。
NIO是面向緩衝的,它會存到緩衝區中,可以移動前後的數據。這樣的目的是確保當數據寫入的時候,緩衝區中存在的數據不會被覆蓋。
2、方式不同
一個是阻塞IO,一個是非阻塞IO
Java中各種流都是阻塞的。意味着當線程調用read()/write()方法的時候,線程會一直阻塞等待數據,在此期間,什麼事情都做不了。
非阻塞IO 在讀取的時候,如果沒有可用的數據,則什麼都不會獲取。而不是一直阻塞,直至可以讀取數據之前,該線程可以繼續做其他的事情。
寫數據的時候同理。所以一個單獨的線程可以管理多個輸入輸入的通道。
3、特有的選擇器
NIO的選擇器允許一個單獨的線程監視多個輸入通道,你可以註冊多個通道到一個選擇器
channel和selector聯合使用,必須要將channel註冊到selector上,通過register()方法來實現。
只要Channel向selector註冊了某個特定的事件,selector就會監聽這些時間是否發生,一旦發生便會通知channel。