Java NIO 教程(四) Scatter/Gather

參考:http://ifeve.com/java-nio-scattergather/
原文地址

目錄

Java NIO開始支持scatter/gatherscatter/gather用于描述從Channel(譯者注:Channel在中文經(jīng)常翻譯為通道)中讀取或者寫入到Channel的操作。

從Channel中分散(scatter)讀取堡僻,是指在讀操作時(shí)將讀取的數(shù)據(jù)寫入多個buffer中。因此怀各,從Channel中讀取的數(shù)據(jù)將“分散(scatter)”到多個Buffer中。
聚集(gather)寫入一個Channel,是指在寫操作時(shí)將多個buffer的數(shù)據(jù)寫入同一個Channel,因此姆另,多個Buffer中的數(shù)據(jù)將“聚集(gather)”后寫入到一個Channel

scatter/gather經(jīng)常用于需要將傳輸?shù)臄?shù)據(jù)分開處理的場合坟乾,例如傳輸一個由消息頭和消息體組成的消息迹辐,你可能會將消息體和消息頭分散到不同的buffer中,這樣你可以方便的處理消息頭和消息體甚侣。

Scattering Reads

Scattering Reads是指數(shù)據(jù)從一個channel讀取到多個buffer中明吩。如下圖描述:

Java NIO: Scattering Read

代碼示例如下:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

注意buffer首先被插入到數(shù)組,然后再將數(shù)組作為channel.read()的輸入?yún)?shù)殷费。read()方法按照buffer在數(shù)組中的順序?qū)?code>channel中讀取的數(shù)據(jù)寫入到buffer印荔,當(dāng)一個buffer被寫滿后,channel緊接著向另一個buffer中寫详羡。

Scattering Reads在移動下一個buffer前仍律,必須填滿當(dāng)前的buffer,這也意味著它不適用于動態(tài)消息(譯者注:消息大小不固定)实柠。換句話說水泉,如果存在消息頭和消息體,消息頭必須完成填充(例如128byte)窒盐,Scattering Reads才能正常工作草则。

Gathering Writes

Gathering Writes是指數(shù)據(jù)從多個buffer寫入到同一個channel。如下圖描述:

Java NIO: Gathering Write

代碼示例如下:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

//此處寫數(shù)據(jù)到buffer中

ByteBuffer[] bufferArray = { header, body };

channel.write(bufferArray);

buffers數(shù)組是write()方法的輸入?yún)?shù)蟹漓,write()方法會按照buffer在數(shù)組中的順序炕横,將數(shù)據(jù)寫入到channel,注意只有positionlimit之間的數(shù)據(jù)才會被寫入葡粒。因此份殿,如果一個buffer的容量為128byte,但是僅僅包含58byte的數(shù)據(jù)嗽交,那么這58byte的數(shù)據(jù)將被寫入到channel中伯铣。因此與Scattering Reads相反,Gathering Writes能較好的處理動態(tài)消息轮纫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腔寡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掌唾,更是在濱河造成了極大的恐慌放前,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糯彬,死亡現(xiàn)場離奇詭異凭语,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撩扒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門似扔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吨些,“玉大人,你說我怎么就攤上這事炒辉『朗” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵黔寇,是天一觀的道長偶器。 經(jīng)常有香客問我,道長缝裤,這世上最難降的妖魔是什么屏轰? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮憋飞,結(jié)果婚禮上霎苗,老公的妹妹穿的比我還像新娘。我一直安慰自己榛做,他們只是感情好叨粘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘤睹,像睡著了一般升敲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轰传,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天驴党,我揣著相機(jī)與錄音,去河邊找鬼获茬。 笑死港庄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恕曲。 我是一名探鬼主播鹏氧,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佩谣!你這毒婦竟也來了把还?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茸俭,失蹤者是張志新(化名)和其女友劉穎吊履,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體调鬓,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艇炎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腾窝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀踪。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡居砖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驴娃,到底是詐尸還是另有隱情奏候,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布托慨,位于F島的核電站鼻由,受9級特大地震影響暇榴,放射性物質(zhì)發(fā)生泄漏厚棵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一蔼紧、第九天 我趴在偏房一處隱蔽的房頂上張望婆硬。 院中可真熱鬧,春花似錦奸例、人聲如沸彬犯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谐区。三九已至,卻和暖如春逻卖,著一層夾襖步出監(jiān)牢的瞬間宋列,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工评也, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炼杖,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓盗迟,卻偏偏與公主長得像坤邪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子罚缕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容