NIO入門之NIO編程「NIO類庫簡介」

在介紹NIO編程以前,咱們首先須要澄清一個概念:NIO究竟是什麼的簡稱?有人稱之爲New I/O,由於它相對於以前的I/O類庫是新增的,因此被稱爲New I/O,這是它的官方叫法。可是,因爲以前老的I/O類庫是阻塞I/O,New I/O類庫的目標就是要讓Java支持非阻塞I/O,因此,更多的人喜歡稱之爲非阻塞I/ONon-block I/O),因爲非阻塞I/O更可以體現NIO的特色,因此咱們這裏使用NIO表示非阻塞I/O。編程

與Socket類和ServerSocket類相對應,NIO也提供了SocketChannelServerSocketChannel兩種不一樣的套接字通道實現。這兩種新增的通道都支持阻塞和非阻塞兩種模式。阻塞模式使用很是簡單,可是性能和可靠性都很差,非阻塞模式則正好相反。開發人員通常能夠根據本身的須要來選擇合適的模式,通常來講,低負載,低併發的應用程序能夠選擇同步阻塞I/O以下降編程複雜度,可是對於高負載,高併發的網絡應用,須要使用NIO的非阻塞模式進行開發。數組

NIO類庫簡介網絡

1. 緩衝區Buffer併發

咱們首先介紹緩衝區Buffer)的概念,Buffer是一個對象,它包含一些要寫入或者要讀出的數據。在NIO類庫中加入Buffer對象,體現了新庫與原I/O的一個重要區別。在面向流的I/O中,能夠將數據直接寫入或者將數據直接讀到Stream對象中。高併發

在NIO庫中,全部數據都是用緩衝區處理的在讀取數據時,它是直接讀到緩衝區中的;在寫入數據時,寫入到緩衝區中。任什麼時候候訪問NIO中的數據,都是經過緩衝區進行操做性能

緩衝區實質上是一個數組。一般它是一個字節數組ByteBuffer),也可使用其餘種類的數組。可是一個緩衝區不只僅是一個數組,緩衝區提供了對數據的結構化訪問以及維護讀寫位置(limit)等信息。spa

最經常使用的緩衝區是ByteBuffer,一個ByteBuffer提供了一組功能用於操做byte數組。除了ByteBuffer,還有其餘的一些緩衝區,事實上,每一種Java基本類型(除了Boolean類型)都對應有一種緩衝區,具體以下:操作系統

  • ByteBuffer:字節緩衝區線程

  • CharBuffer:字符緩衝區對象

  • ShortBuffer:短整型緩衝區

  • IntBuffer:整型緩衝區

  • LongBuffer:長整型緩衝區

  • FloatBuffer:浮點型緩衝區

  • DoubleBuffer:雙精度浮點型緩衝區

每個Buffer類都是Buffer接口的一個子實例。除了ByteBuffer,每個Buffer類都有徹底同樣的操做,只是它們所處理的數據類型不同。由於大多數標準I/O操做都使用ByteBuffer,因此它除了具備通常緩衝區的操做以外還提供一些特有的操做,方便網絡讀寫。

2. 通道Channel

Channel是一個通道,能夠經過它讀取和寫入數據,它就像輸水管道同樣,網絡數據經過Channel讀取和寫入。通道與流的不一樣之處在於通道是雙向的流只是在一個方向上移動(一個流必須是InputStream 或者 OutputStream的子類),並且通道能夠用於讀,寫或者同時用於讀寫。

由於Channel全雙工的,因此它能夠比流更好地映射底層操做系統的API。特別是在UNIX網絡編程模型中,底層操做系統的通道都是全雙工的,同時支持讀寫操做。 

根據Channel的類繼承關係,實際上Channel能夠分爲兩大類:分別是用於網絡讀寫SelectableChannel和用於文件操做FileChannel。本節涉及的ServerSocketChannelSocketChannel都是SelectableChannel的子類。

3. 多路複用器Selector

多路複用器Selector,它是Java NIO編程的基礎,熟練地掌握Selector對於掌握NIO編程相當重要。多路複用器提供選擇已經就緒的任務的能力。簡單來說,Selector會不斷地輪詢註冊在其上的Channel,若是某個Channel上面有新的TCP鏈接接入,讀和寫事件,這個Channel就處於就緒狀態,會被Selector輪詢出來,而後經過SelectionKey能夠獲取就緒Channel的集合,進行後續的I/O操做

一個多路複用器Selector能夠同時輪詢多個Channel,因爲JDK使用了epoll()代替傳統的select實現,因此它並沒有最大鏈接句柄1024/2048的限制。這也就意味着只須要一個線程負責Selector的輪詢,就能夠接入成千上萬的客戶端,這確實是個很是巨大的進步。

相關文章
相關標籤/搜索