1 Channel
– 數(shù)據(jù)的源頭或者數(shù)據(jù)的目的地
![]() 2.1 基本接口
基礎(chǔ)的通道接口只有兩個(gè)方法,判斷通道是否開(kāi)啟,以及關(guān)閉通道 2.2 讀和寫(xiě)
ReadableByteChannel和WritableByteChannel定義了通道基本都是基于ByteBuffer操作的 ByteChannel繼承了前面兩個(gè),因此一般可以被用來(lái)實(shí)現(xiàn)可讀可寫(xiě)的通道 public interface ByteChannel extends ReadableByteChannel, WritableByteChannel { } 2.3 阻塞與非阻塞SelectableChannel表明了通道是支持有條件的選擇,即Selector,和非阻塞結(jié)合就可以實(shí)現(xiàn)多路復(fù)用的 通道可以以阻塞(blocking)或非阻塞(nonblocking )模式運(yùn)行。非阻塞模式的通道永遠(yuǎn)不會(huì)讓調(diào)用的線(xiàn)程休眠。請(qǐng)求的操作要么立即完成,要么返回一個(gè)結(jié)果表明未進(jìn)行任何操作。只有面向流的(stream -oriented)的通道,如 sockets 和pipes才能使用非阻塞模式,將非阻塞 2.4 可中斷與不可中斷如果一個(gè)通道實(shí)現(xiàn)了Interrupted接口,那么,當(dāng)他被阻塞,并且發(fā)生中斷的時(shí)候,那么該通道將會(huì)被中斷,線(xiàn)程會(huì)拋出一個(gè)ClosedByInterruptException異常,如果一個(gè)線(xiàn)程的狀態(tài)是中斷,他試圖訪(fǎng)問(wèn)一個(gè)通道,那么通道將立即被關(guān)閉 2.5 Scatter和Gather簡(jiǎn)單的說(shuō)就是可以將讀取的數(shù)據(jù)填充到對(duì)個(gè)緩沖區(qū),將多個(gè)緩沖區(qū)的數(shù)據(jù)一次寫(xiě)出,號(hào)稱(chēng)和Direct內(nèi)存結(jié)合性能會(huì)很不錯(cuò),還沒(méi)能力考證... 1.對(duì)于寫(xiě)入,一般的框架在,都是在寫(xiě)完一段數(shù)據(jù),就給一個(gè)事件,表明寫(xiě)完,這種場(chǎng)景下Gather的作用就不大了,不過(guò)如果能夠接受批量寫(xiě)的話(huà)(比如每次寫(xiě)10段數(shù)據(jù),寫(xiě)完以后一段段通知),那也許可以試試 2.對(duì)于讀取,感覺(jué)作用不是很大,把head和body分到兩個(gè)ByteBuffer里和一個(gè)ByteBuffer里有毛區(qū)別? 參考 NIO - Scatter/Gather 2.6 打開(kāi)通道(文件/Socket)
從廣義IO角度來(lái)說(shuō),有兩大類(lèi):File IO和Stream IO,因此通道也大致有兩類(lèi),FileChannel和套接字(Socket)通道,包括SocketChannel、ServerSocketChannel和DatagramChannel,Socket通過(guò)可以直接通過(guò)工廠方法創(chuàng)建,但是一個(gè)FileChannel只能通過(guò)一個(gè)打開(kāi)的RandomAccessFile、FileInputStream、FileOutputStream對(duì)象上調(diào)用getChannel方法來(lái)獲取 SocketChannel sc = SocketChannel.open( );
DatagramChannel dc = DatagramChannel.open( ); RandomAccessFile raf = new RandomAccessFile ("somefile", "r"); FileChannel fc = raf.getChannel( ); 2.7 使用通道(特性和IO實(shí)例相關(guān))
通道可以使單向的或者雙向的,即只讀/只寫(xiě)/可讀可寫(xiě) 對(duì)于每個(gè)File或者Scoket通道來(lái)說(shuō),都是雙向的,對(duì)于Socket不是我關(guān)心,因?yàn)樗旧砭褪请p向的,但是對(duì)于File,可以在不同的時(shí)候以不同的權(quán)限打開(kāi),因此Read-only打開(kāi)的文件調(diào)用write方法時(shí)候會(huì)拋出NonWriteChannelException,通道會(huì)連接一個(gè)通道實(shí)例(channel instance),具體的屬性受該實(shí)例的限制,比如文件沒(méi)有寫(xiě)權(quán)限,但是可能有write方法。 |
|
來(lái)自: 碧海山城 > 《通道和NIO基礎(chǔ)》