<meta charset="utf-8">
NIO
NIO主要有三大核心部分:
Channel(通道)译秦,Buffer(緩沖區(qū)), Selector(選擇器雅采,多路復(fù)用器)。
傳統(tǒng)IO基于字節(jié)流和字符流進行操作鸡岗,而NIO基于Channel和Buffer(緩沖區(qū))進行操作,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中编兄,或者從緩沖區(qū)寫入到通道中轩性。Selector(選擇區(qū))用于監(jiān)聽多個通道的事件(比如:連接打開,數(shù)據(jù)到達)翻诉。因此炮姨,單個線程可以監(jiān)聽多個數(shù)據(jù)通道捌刮。
同步io和異步IO的區(qū)別
同步IO和異步IO模型是針對用戶線程和內(nèi)核的交互來說的:
對于同步IO:當用戶發(fā)出IO請求操作之后,如果數(shù)據(jù)沒有就緒舒岸,需要通過用戶線程或者內(nèi)核不斷地去輪詢數(shù)據(jù)是否就緒绅作,當數(shù)據(jù)就緒時,再將數(shù)據(jù)從內(nèi)核拷貝到用戶線程蛾派;
而異步IO:只有IO請求操作的發(fā)出是由用戶線程來進行的俄认,IO操作的兩個階段都是由內(nèi)核自動完成,然后發(fā)送通知告知用戶線程IO操作已經(jīng)完成洪乍。也就是說在異步IO中眯杏,不會對用戶線程產(chǎn)生任何阻塞。
Channel
首先說一下Channel壳澳,國內(nèi)大多翻譯成“通道”岂贩。Channel和IO中的Stream(流)是差不多一個等級的。只不過Stream是單向的巷波,譬如:InputStream, OutputStream.而Channel是雙向的萎津,既可以用來進行讀操作,又可以用來進行寫操作抹镊。
NIO中的Channel的主要實現(xiàn)有:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
這里看名字就可以猜出個所以然來:分別可以對應(yīng)文件IO锉屈、UDP和TCP(Server和Client)。下面演示的案例基本上就是圍繞這4個類型的Channel進行陳述的垮耳。
Buffer
NIO中的關(guān)鍵Buffer實現(xiàn)有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer颈渊,分別對應(yīng)基本數(shù)據(jù)類型: byte, char, double, float, int, long, short。當然NIO中還有MappedByteBuffer, HeapByteBuffer, DirectByteBuffer等這里先不進行陳述终佛。
Selector
Selector運行單線程處理多個Channel俊嗽,如果你的應(yīng)用打開了多個通道,但每個連接的流量都很低查蓉,使用Selector就會很方便乌询。例如在一個聊天服務(wù)器中。要使用Selector, 得向Selector注冊Channel豌研,然后調(diào)用它的select()方法妹田。這個方法會一直阻塞到某個注冊的通道有事件就緒。一旦這個方法返回鹃共,線程就可以處理這些事件鬼佣,事件的例子有如新的連接進來、數(shù)據(jù)接收等霜浴。