參考資料:html
http://www.importnew.com/19816.html緩存
NIO 三大核心部分:網絡
Channel(通道)、Buffer(緩衝區)、Selector(選擇區)app
NIO和傳統IO的不一樣之處:spa
傳統IO : 線程
基於字節流和字符流進行操做;htm
IO是面向流的:blog
意味着每次從流中讀取一個或多個字節,直至讀取全部字節,它們沒有被緩存在任何地方。此外,它不能先後移動流中的數據,若是須要先後移動從流中讀取的數據,須要先將它緩存到一個緩衝區;教程
IO的各類流是阻塞的:
意味着當一個線程調用read()或write()時,該線程被阻塞,直到有一些數據被讀取,或數據徹底寫入,在此期間該線程不能再幹任何事情了。
NIO :
基於Channel和Buffer進行操做:數據老是從通道讀取到緩衝區中,或者從緩衝區寫入到通道中。Selector用於監聽多個通道的事件。所以,單個線程能夠監聽多個數據通道;
NIO是面向緩衝區的:
NIO的緩衝導向方法略有不一樣:數據讀取到一個它稍後處理的緩衝區,須要時可在緩衝區中先後移動,增長了處理過程當中的靈活性。可是,還須要檢查是否該緩衝區中包含全部您須要處理的數據。並且,須要確保當更多的數據讀入緩衝區時,不要覆蓋緩衝區裏還沒有處理的數據;
NIO的非阻塞模式:
使一個線程從某通道發送請求讀取數據,可是它僅能獲得目前可用的數據,若是目前沒有數據可用時,就什麼都不會獲取,而不是保持線程阻塞,因此直至數據變的能夠讀取以前,該線程能夠繼續作其餘的事情。
非阻塞寫也是如此,一個線程請求寫入一些數據到某通道,但不須要等待它徹底寫入,這個線程同時能夠去作別的事情。
線程一般將非阻塞IO的空閒時間用於在其餘通道上執行IO操做,因此一個單獨的線程如今能夠管理多個輸入和輸出通道。
Channel:
Channel和IO中Stream(流)是差很少一個等級的。只不過Stream是單向的,譬如:InputStream,OutputStream. 而Channel是雙向的,既能夠用來進行讀操做,又能夠用來進行寫操做。
NIO中Channel的主要實現有:
FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel
FileChannel從文件中讀寫數據(文件IO);
DatagramChannel能經過UDP讀寫網絡中的數據;
SocketChannel能經過TCP讀寫網絡中的數據;
ServerSocketChannel能夠監聽新進來的TCP鏈接,像Web服務器那樣。對每個新進來的鏈接都會建立一個SocketChannel。
Buffer:
NIO中關鍵的Buffer實現:
ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer
分別對應基本數據類型:byte、char、double、float、int、long、short。
NIO中還有MappedByteBuffer,用於標識內存映射文件。
Selector:
Selector運行單線程處理多個Channel。若是你的應用打開了多個通道,但每一個鏈接的流量都很低,使用Selector就會很方便。例如,在一個聊天服務器中。
這是在一個單線程中使用一個Selector處理3個Channel的圖示:
要使用Selector,得向Selector註冊Channel,而後調用它的select()方法。這個方法會一直阻塞到某個註冊的通道有事件就緒。一旦這個方法返回,線程就能夠處理這些事件,事件的例子有如新鏈接進來,數據接收等。