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