NIO又叫NonBlockingI/O,即非阻塞I/O。以此對應的,有一個更常見的IO(BIO),又叫Blocking I/O,即阻塞IO,兩種都爲Java的IO實現方案。
以客戶端鏈接服務器爲例,服務器須要獲取客戶端的鏈接,即Socket,傳統I/O若是沒有獲取到鏈接則一直阻塞,知道拿到爲止,即函數:
\[ accept() \]
而NIO則採用一種沒有鏈接則直接返回的非阻塞方式進行客戶端鏈接獲取。
java
BIO以Stream爲傳遞的基本單位,將各種數據裝換爲Stream進行傳遞寫入,而NIO引入了Buffer和Channel的理念,將數據寫入Buffer,以Buffer爲載體,在Channel中傳遞,下面來看看官方文檔對其的定義:
Buffer
特定的基本類型數據的容器,Buffer是特定的基本類型的線性、有序序列的集合,其含有三個參數:capacity、limit和position。api
capacity :標示Buffer全部能承載的最大類型數量,其不會爲負也不會改變;
limit :是第一個不該該不被讀寫的元素的索引,其不會爲負也不會大於capacity;
position :是下一個應該被讀寫元素的索引,其不會爲負也不會大於limit
除此以外:對於每一個非布爾基元類型,這個類有一個子類,好比:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer服務器
Channel
I/O操做的鏈接。通道表示對實體的開放鏈接,例如硬件設備、文件、網絡套接字,或可執行一個或多個不一樣I/O操做的程序組件,例如讀取或寫入。
通道不是打開就是關閉。通道在建立時是打開的,一旦關閉,它將保持關閉狀態。一旦通道被關閉,任何試圖在其上調用I/O操做的嘗試都會致使一個ClosedChannelException被拋出。通道是否打開能夠經過調用其isOpen方法進行測試。網絡
- Socket網絡服務
利用SocketChannel,Buffer,Selector等類構建一個經過輪詢方式,以請求對應線程的服務端的I/O服務。
- Files 文件類的操做
一般咱們利用傳統I/O處理文件,須要使用FileInputStream、FileOutputStream來進行文件處理,而NIO的Files和Path二者結合起來就能夠處理不少文件相關的操做,如copy()、write() 等。有現成的函數能夠調用,而不用再在流轉化上花費更多的時間。
與此同時,NIO對文件系統,目錄等的迭代也有相關具體實現。
詳情請參考 API文檔: Java™ Platform
Standard Ed. 8oracle