
Java NIO
NIO基本介紹
-
Java NIO: Java New IO
- 是一個可以替代標準Java IO API的IO API
- Java NIO提供了與標準IO不同的工作方式
通道和緩沖區(qū)
-
通道和緩沖區(qū): Channels and Buffers
- 標準IO是基于字節(jié)流和字符流進行操作的
- NIO是基于通道Channel和緩沖區(qū)Buffer進行操作:
- 數(shù)據(jù)總是從通道讀取到緩沖區(qū)
- 數(shù)據(jù)總是從緩沖區(qū)寫入到通道
非阻塞IO
-
非阻塞IO: Non-blocking IO
- Java NIO可以非阻塞地使用IO:
- 當線程從通道讀取數(shù)據(jù)到緩沖區(qū)時,線程還可以進行其余操作;當數(shù)據(jù)被寫入到緩沖區(qū)時,線程也可以進行其余操作
- 當數(shù)據(jù)從緩沖區(qū)寫入到通道時,線程也可以進行其余操作
- Java NIO可以非阻塞地使用IO:
選擇器
-
選擇器: Selectors
- 用于監(jiān)聽多個通道的事件. 比如連接打開,數(shù)據(jù)到達
- 單個線程可以監(jiān)聽多個數(shù)據(jù)通道
NIO核心組件
- Java NIO的核心組件:
- Channels
- Buffers
- Selectors
Channel和Buffer
- 所有的IO在NIO中都是從一個Channel開始的
-
Channel類似數(shù)據(jù)流:
- 數(shù)據(jù)可以從Channel讀到Buffer中
- 數(shù)據(jù)也可以從Buffer讀到Channel中
-
Channel的主要實現(xiàn): 涵蓋了UDP和TCP網(wǎng)絡IO以及文件IO
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
-
Buffer的主要實現(xiàn): 覆蓋了能通過IO發(fā)送的基本數(shù)據(jù)類型-byte,short,int,long,float,double,char
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
- Java NIO中還有一個MappedByteBuffer, 用于表示內(nèi)存映射文件
Selector
-
Selector允許單線程處理多個Channel:
- 如果應用打開了多個連接通道,但是每個連接的數(shù)據(jù)流量都很低,使用Selector就會很方便
-
示例: 在一個單線程中使用一個Selector處理3個Channel
在這里插入圖片描述 - 要使用Selector, 得向Selector注冊Channel, 然后調(diào)用Selector中的select() 方法 .
- 這個方法會一直阻塞到某個注冊的通道有事件就緒.一旦這個方法返回,線程就可以處理這些事件,比如新連接和數(shù)據(jù)接收等