參考:http://ifeve.com/java-nio-scattergather/
原文地址
目錄
- Java NIO教程
- Java NIO 教程(一) 概述
- Java NIO 教程(二) Channel
- Java NIO 教程(三) Buffer
- Java NIO 教程(四) Scatter/Gather
- Java NIO 教程(五) 通道之間的數(shù)據(jù)傳輸
- Java NIO 教程(六) Selector
- Java NIO 教程(七) FileChannel
- Java NIO 教程(八) SocketChannel
- Java NIO 教程(九) ServerSocketChannel
- Java NIO 教程(十) 非阻塞式服務(wù)器
- Java NIO 教程(十一) Java NIO DatagramChannel
- Java NIO 教程(十二) Pipe
- Java NIO 教程(十三) Java NIO vs. IO
- Java NIO 教程(十四) Java NIO Path
- Java NIO 教程(十五) Java NIO Files
- Java NIO 教程(十六) Java NIO AsynchronousFileChannel
Java NIO開始支持scatter
/gather
,scatter
/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
中明吩。如下圖描述:
代碼示例如下:
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
。如下圖描述:
代碼示例如下:
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
,注意只有position
和limit
之間的數(shù)據(jù)才會被寫入葡粒。因此份殿,如果一個buffer
的容量為128byte,但是僅僅包含58byte的數(shù)據(jù)嗽交,那么這58byte的數(shù)據(jù)將被寫入到channel
中伯铣。因此與Scattering Reads
相反,Gathering Writes
能較好的處理動態(tài)消息轮纫。