Java NIO 教程(四) Scatter/Gather

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

目錄

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

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

scatter/gather經(jīng)常用于需要將傳輸?shù)臄?shù)據(jù)分開(kāi)處理的場(chǎng)合,例如傳輸一個(gè)由消息頭和消息體組成的消息,你可能會(huì)將消息體和消息頭分散到不同的buffer中,這樣你可以方便的處理消息頭和消息體。

Scattering Reads

Scattering Reads是指數(shù)據(jù)從一個(gè)channel讀取到多個(gè)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ù)寫(xiě)入到buffer,當(dāng)一個(gè)buffer被寫(xiě)滿(mǎn)后,channel緊接著向另一個(gè)buffer中寫(xiě)。

Scattering Reads在移動(dòng)下一個(gè)buffer前,必須填滿(mǎn)當(dāng)前的buffer,這也意味著它不適用于動(dòng)態(tài)消息(譯者注:消息大小不固定)。換句話(huà)說(shuō),如果存在消息頭和消息體,消息頭必須完成填充(例如128byte),Scattering Reads才能正常工作。

Gathering Writes

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

Java NIO: Gathering Write

代碼示例如下:

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

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

ByteBuffer[] bufferArray = { header, body };

channel.write(bufferArray);

buffers數(shù)組是write()方法的輸入?yún)?shù),write()方法會(huì)按照buffer在數(shù)組中的順序,將數(shù)據(jù)寫(xiě)入到channel,注意只有positionlimit之間的數(shù)據(jù)才會(huì)被寫(xiě)入。因此,如果一個(gè)buffer的容量為128byte,但是僅僅包含58byte的數(shù)據(jù),那么這58byte的數(shù)據(jù)將被寫(xiě)入到channel中。因此與Scattering Reads相反,Gathering Writes能較好的處理動(dòng)態(tài)消息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容