第二節 netty前傳-NIO簡介
Java IO/">NIO是Java的替代IO API(從jdk1.4開始),意味著替代標準Java IO和Java 網路API。 Java NIO提供了與標準IO API不同的使用IO的方式。
java nio有三大核心部分分別是Channel,Buffer 和 Selector 構成了核心的API。其它元件,如Pipe和FileLock,只不過是與三個核心元件共同使用的工具類。下面對先對這三個核心部分簡單介紹
- Java NIO: Channels and Buffers
在標準java的IO API中,使用位元組流和字元流。而在NIO中,使用是通道(Channels )和緩衝區(Buffers)。 資料總是從通道讀入緩衝區,或從緩衝區寫入通道
- Java NIO: Non-blocking IO
Java NIO能夠執行非阻塞IO。 例如,執行緒可以要求通道將資料讀入緩衝區。 當通道將資料讀入緩衝區的過程中,執行緒可以執行其他操作。 一旦資料已被讀入緩衝區,執行緒就可以繼續處理它。 將資料寫入通道也是如此。
- Java NIO: Selectors
Java NIO包含 “選擇器(Selectors)” 的概念。 Selectors是一個可以監視多個事件通道的物件(例如:連線開啟,資料到達、資料讀寫等)。 因此,單個執行緒可以監視多個通道的資料。就是nio的多路複用
Buffer
NIO中的關鍵Buffer實現有:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
-
ShortBuffer
分別對應基本資料型別: byte, char, double, float, int, long, short。當然NIO中還有 HeapByteBuffer, DirectByteBuffer表示堆記憶體和直接記憶體(少了從系統到虛擬機器之間資料的複製操作,所以更快效率更高,但是由於直接記憶體不由jvm管理所以也更容易出現記憶體洩漏。)
之後會單獨對詳細介紹
Channel
Channel和IO中的Stream(流)是差不多一個等級的。不過Stream是單向的,如:InputStream, OutputStream.而Channel是雙向的,既可以用來進行讀操作,又可以用來進行寫操作。
NIO中的Channel的主要實現有:
- FileChannel
- DatagramChannel
- SocketChannel
-
ServerSocketChannel
從上述的名字就可以猜出:分別對應的是檔案IO、UDP和TCP(Server和Client)。
Selector
Selector就是上面介紹的選擇器。在執行單執行緒可以處理多個Channel,如果一個應用打開了多個通道,但每個連線的流量都很低(本質上表示每個連線處理很短暫,很快就斷開了),使用Selector就會很方便。例如一個訊息中介軟體,在監聽某個
topic可類比。通過使用Selector, 在向Selector註冊相應的Channel,然後呼叫它的select()方法。這個方法會一直阻塞到某個註冊的通道有事件就緒(有訊息推送過來)。一旦這個方法返回,執行緒就可以處理這些事件。
具體例子使用見下一節