天天看點

Netty學習系列(二)-- NIO介紹簡介三大核心NIO和IO的差別

簡介

    nio 是non-blocking的簡稱,在jdk1.4 裡提供的新api 。Sun 官方标榜的特性如下: 為所有的原始類型提供(Buffer)緩存支援。字元集編碼解碼解決方案。 Channel :一個新的原始I/O 抽象。支援鎖和記憶體映射檔案的檔案通路接口。提供多路(non-bloking) 非阻塞式的高伸縮性網絡I/O 。

三大核心

    NIO主要有三大核心部分:Channel(通道),Buffer(緩沖區),Selector。傳統IO基于位元組流和字元流進行操作,而NIO基于Channel和Buffer(緩沖區)進行操作,資料總是從通道讀取到緩沖區中,或者從緩沖區寫入到通道中。Selector(選擇區)用于監聽多個通道的事件(比如:連接配接打開,資料到達)。是以,單個線程可以監聽多個資料通道。

  Channel

    Channel和IO中的Stream(流)是差不多一個等級的。隻不過Stream是單向的,譬如:InputStream,OutputStream.而Channel是雙向的,既可以用來進行讀操作,又可以用來進行寫操作。Channel通常被翻譯為“通道”。

    NIO常見Channel有:FileChannel,DatagramChannel,SocketChannel,ServerSocketChannel。

  Buffer

    NIO中的buffer的關鍵實作有:ByteBuffer,CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,對應iO中的基本資料類型的byte,char, double, float, int, long, short。

  Selector

    Selector運作單線程處理多個Channel,但是多個Channel需要注冊到對應的selector。

NIO和IO的差別

  IO面向流的,而NIO是面向緩沖區的

    Java IO面向流意味着每次從流中讀一個或多個位元組,直至讀取所有位元組,它們沒有被緩存在任何地方。這樣無法對讀取的内容進行處理,想要處理,需要先将它緩存到一個緩沖區。

    Java NIO資料讀取到一個它稍後處理的緩沖區,可以在緩沖區處理資料,使得處理過程更加靈活。需要注意檢查資料是否是你需要的并且在讀取更多的資料時,需要保證資料可以被正确處理,未讀的不被覆寫等。

  IO阻塞,而NIO是非阻塞的

    Java IO的各種流是阻塞的。也就是,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些資料被讀取,或資料完全寫入。該線程在此期間不能再幹任何事情了。隻能是同一時間隻能做一件事情。

    Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取資料,有則用,沒有不擷取,不會保持線程阻塞,是以直至資料變的可以讀取之前,該線程可以繼續做其他的事情。非阻塞寫也是如此。是以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。

  選擇器selector

    Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以注冊多個通道使用一個選擇器,然後使用一個單獨的線程來“選擇”通道:這些通道裡已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。

    下一節我們通過例子來學習NIO程式設計。