Java NIO 系列學習(一)Java NIO概述

參考資料:html

  http://www.importnew.com/19816.html緩存

  http://ifeve.com/overview/服務器

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()方法。這個方法會一直阻塞到某個註冊的通道有事件就緒。一旦這個方法返回,線程就能夠處理這些事件,事件的例子有如新鏈接進來,數據接收等。

相關文章
相關標籤/搜索