Java NIO系列教程(四) Scatter/Gather
轉(zhuǎn)載自? ?Java NIO系列教程(四) Scatter/Gather
譯文地址??作者:Jakob Jenkov ??譯者:郭蕾? ?
Java NIO開(kāi)始支持scatter/gather,scatter/gather用于描述從Channel(譯者注:Channel在中文經(jīng)常翻譯為通道)中讀取或者寫(xiě)入到Channel的操作。
分散(scatter)從Channel中讀取是指在讀操作時(shí)將讀取的數(shù)據(jù)寫(xiě)入多個(gè)buffer中。因此,Channel將從Channel中讀取的數(shù)據(jù)“分散(scatter)”到多個(gè)Buffer中。
聚集(gather)寫(xiě)入Channel是指在寫(xiě)操作時(shí)將多個(gè)buffer的數(shù)據(jù)寫(xiě)入同一個(gè)Channel,因此,Channel 將多個(gè)Buffer中的數(shù)據(jù)“聚集(gather)”后發(fā)送到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
代碼示例如下:
| 1 | ByteBuffer header = ByteBuffer.allocate(128); |
| 2 | ByteBuffer body?? = ByteBuffer.allocate(1024); |
| 3 | ? |
| 4 | ByteBuffer[] bufferArray = { header, body }; |
| 5 | ? |
| 6 | channel.read(bufferArray); |
注意buffer首先被插入到數(shù)組,然后再將數(shù)組作為channel.read() 的輸入?yún)?shù)。read()方法按照buffer在數(shù)組中的順序?qū)腸hannel中讀取的數(shù)據(jù)寫(xiě)入到buffer,當(dāng)一個(gè)buffer被寫(xiě)滿后,channel緊接著向另一個(gè)buffer中寫(xiě)。
Scattering Reads在移動(dòng)下一個(gè)buffer前,必須填滿當(dāng)前的buffer,這也意味著它不適用于動(dòng)態(tài)消息(譯者注:消息大小不固定)。換句話說(shuō),如果存在消息頭和消息體,消息頭必須完成填充(例如 128byte),Scattering Reads才能正常工作。
Gathering Writes
Gathering Writes是指數(shù)據(jù)從多個(gè)buffer寫(xiě)入到同一個(gè)channel。如下圖描述:
Java NIO: Gathering Write
代碼示例如下:
| 1 | ByteBuffer header = ByteBuffer.allocate(128); |
| 2 | ByteBuffer body?? = ByteBuffer.allocate(1024); |
| 3 | ? |
| 4 | //write data into buffers |
| 5 | ? |
| 6 | ByteBuffer[] bufferArray = { header, body }; |
| 7 | ? |
| 8 | channel.write(bufferArray); |
buffers數(shù)組是write()方法的入?yún)?#xff0c;write()方法會(huì)按照buffer在數(shù)組中的順序,將數(shù)據(jù)寫(xiě)入到channel,注意只有position和limit之間的數(shù)據(jù)才會(huì)被寫(xiě)入。因此,如果一個(gè)buffer的容量為128byte,但是僅僅包含58byte的數(shù)據(jù),那么這58byte的數(shù)據(jù)將被寫(xiě)入到channel中。因此與Scattering Reads相反,Gathering Writes能較好的處理動(dòng)態(tài)消息。
總結(jié)
以上是生活随笔為你收集整理的Java NIO系列教程(四) Scatter/Gather的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑键盘各键功能和使用之电脑键盘功能与使
- 下一篇: 无线无卡如何和无线路由器直连无线网卡上网