日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

nio通道(1)----通道基礎(chǔ)接口

 碧海山城 2012-08-22

1           Channel

  數(shù)據(jù)的源頭或者數(shù)據(jù)的目的地
 
用于向 buffer 提供數(shù)據(jù)或者讀取 buffer 數(shù)據(jù) ,buffer 對象的唯一接口。
 
異步 I/O 支持--  包含socket,filepipe三種管道,都是全雙工的通道。
 

 
 
 
 
2          
通道基礎(chǔ)

2.1      基本接口

 

基礎(chǔ)的通道接口只有兩個方法,判斷通道是否開啟,以及關(guān)閉通道

 

2.2    和寫

ReadableByteChannelWritableByteChannel定義了通道基本都是基于ByteBuffer操作的

ByteChannel繼承了前面兩個,因此一般可以被用來實現(xiàn)可讀可寫的通道

public interface ByteChannel

    extends ReadableByteChannel, WritableByteChannel

{

} 

有些注意點,請看 nio通道(2)的幾個注意點

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    ScatterGather

簡單的說就是可以將讀取的數(shù)據(jù)填充到對個緩沖區(qū),將多個緩沖區(qū)的數(shù)據(jù)一次寫出,號稱和Direct內(nèi)存結(jié)合性能會很不錯,還沒能力考證...

 

1.對于寫入,一般的框架在,都是在寫完一段數(shù)據(jù),就給一個事件,表明寫完,這種場景下Gather的作用就不大了,不過如果能夠接受批量寫的話(比如每次寫10段數(shù)據(jù),寫完以后一段段通知),那也許可以試試

 

2.對于讀取,感覺作用不是很大,把headbody分到兩個ByteBuffer里和一個ByteBuffer里有毛區(qū)別?

 

參考

NIO - Scatter/Gather
Java NIO Scatter / Gather

 

2.6      打開通道(文件/Socket)

 

從廣義IO角度來說,有兩大類:File IOStream IO,因此通道也大致有兩類,FileChannel和套接字(Socket)通道,包括SocketChannel、ServerSocketChannelDatagramChannelSocket通過可以直接通過工廠方法創(chuàng)建,但是一個FileChannel只能通過一個打開的RandomAccessFile、FileInputStream、FileOutputStream對象上調(diào)用getChannel方法來獲取

 

SocketChannel sc = SocketChannel.open( );
sc.connect (new InetSocketAddress ("somehost", someport)); 


ServerSocketChannel ssc = ServerSocketChannel.open( );
ssc.socket( ).bind (new InetSocketAddress (somelocalport));

 

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方法。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多