02. Java NIO 概覽

NIO包含下面幾個核心的組件:java

  • Channels
  • Buffers
  • Selectors

整個NIO體系包含的類遠遠不止這幾個,可是在筆者看來Channel,Buffer和Selector組成了這個核心的API。其餘的一些組件,好比Pipe和FileLock僅僅只做爲上述三個的負責類。所以在概覽這一節中,會重點關注這三個概念。其餘的組件會在各自的部分單獨介紹。服務器

通道和緩衝區(Channels and Buffers)

一般來講NIO中的全部IO都是從Channel開始的。Channel和流有點相似。經過Channel,咱們便可以從Channel把數據寫到Buffer中,也能夠吧數據衝Buffer寫入到Channel,下圖是一個示意圖:網絡

http://tutorials.jenkov.com/images/java-nio/overview-channels-buffers.png

Java NIO: Channels read data into Buffers, and Buffers write data into Channelsapp

有不少的Channel,Buffer類型。下面列舉了主要的幾種:spa

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

正如你看到的,這些channel基於於UPD和TCP的網絡IO,以及文件IO。 和這些類一塊兒的還有其餘一些比較有趣的接口,在本節中暫時很少介紹。爲了簡介起見,咱們會在必要的時候引入這些概念。 下面是核心的Buffer實現類的列表:線程

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

這些Buffer涵蓋了能夠經過IO操做的基礎類型:byte,short,int,long,float,double以及characters. NIO實際上還包含一種MappedBytesBuffer,通常用於和內存映射的文件。接口

選擇器(Selectors)

選擇器容許單線程操做多個通道。若是你的程序中有大量的連接,同時每一個連接的IO帶寬不高的話,這個特性將會很是有幫助。好比聊天服務器。 下面是一個單線程中Slector維護3個Channel的示意圖:ip

http://tutorials.jenkov.com/images/java-nio/overview-selectors.png

Java NIO: A Thread uses a Selector to handle 3 Channel's內存

要使用Selector的話,咱們必須把Channel註冊到Selector上,而後就能夠調用Selector的selectr()方法。這個方法會進入阻塞,直到有一個channel的狀態符合條件。當方法範湖後,線程能夠處理這些時間。it

相關文章
相關標籤/搜索