1. 程式人生 > >Java NIO筆記(一):NIO介紹

Java NIO筆記(一):NIO介紹

事件 .net 數據報 數據類型 單線程 long 處理 哪些 選擇

Java NIO即Java Non-blocking IO(Java非堵塞I/O),由於是在Jdk1.4之後添加的一套新的操作I/O工具包,所以通常會被叫做Java New IO。NIO是為提供I/O吞吐量而專門設計。其卓越的性能甚至能夠與C媲美。

NIO是通過Reactor模式的事件驅動機制來達到Non blocking的,那麽什麽是Reactor模式呢?Reactor翻譯成中文是“反應器”,就是我們將事件註冊到Reactor中,當有對應的事件發生時,Reactor便會告知我們有哪些事件發生了。我們再依據詳細的事件去做對應的處理。

程序的性能非常大程度上是受到I/O限制的,所以有非常多人會說程序的性能瓶頸就在I/O上也毫不為過。以下這張圖顯示了I/O對程序吞吐量的影響

技術分享

由上圖可見I/O對程序的吞吐率有著決定性的因素。

Java中舊的IO接口。對文件操作僅僅能一個字節一個字節或一行一行的讀,對Socket IO會堵塞,能夠為每個Socket創建一個Thread,可是這種系統開銷和資源浪費都太大,不是合理選擇;而NIO對Socket IO能夠實現非堵塞,能夠用單線程管理多個通道。而且NIO有了緩沖區的概念,無論是File IO還是Socket IO都是在和Buffer相互讀取。看下圖

技術分享

所以NIO能夠先將通道數據讀到緩沖區中再進行操作。避免了逐字節或逐行讀取的性能開銷。

NIO有三個核心模塊:Selector(選擇器)、Channel(通道)、Buffer(緩沖區),另外java.nio.charsets包下新增的字符集類也是nio一個重要的模塊。但個人認為不算是NIO的核心,僅僅是一個供NIO核心類使用的工具類。

Selector同意單個線程處理多個Channel,相比舊的IO為防止堵塞而為每個Channel創建一個Thread來說。性能高出許多。僅僅用SelectableChannel才幹註冊到Selector。單線程處理多個Channel例如以下圖

技術分享

將Channel註冊到Selector中。輪詢調用select()。這種方法會堵塞,當註冊的某個通道準備好要進行IO操作時,這個便返回已選擇鍵的個數,此時通過selectedKeys獲得已選擇的鍵。就能夠進行相關的IO操作了;選擇鍵(SelectionKey)是用來連接Selector和Channel。將在興許解說。

Channel主要有:FileChannel、ServerSocketChannel、SocketChannel、DatagramChannel,這四種通道涵蓋了文件IO、TCP套接字IO、UDP數據報IO。

Buffer主要有:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer,涵蓋了IO操作的基本數據類型。

Java NIO筆記(一):NIO介紹