作者:jakob jenkov 譯者:郭蕾
java nio開始支援scatter/gather,scatter/gather用于描述從channel(譯者注:channel在中文經常翻譯為通道)中讀取或者寫入到channel的操作。
分散(scatter)從channel中讀取是指在讀操作時将讀取的資料寫入多個buffer中。是以,channel将從channel中讀取的資料“分散(scatter)”到多個buffer中。
聚集(gather)寫入channel是指在寫操作時将多個buffer的資料寫入同一個channel,是以,channel 将多個buffer中的資料“聚集(gather)”後發送到channel。
scatter / gather經常用于需要将傳輸的資料分開處理的場合,例如傳輸一個由消息頭和消息體組成的消息,你可能會将消息體和消息頭分散到不同的buffer中,這樣你可以友善的處理消息頭和消息體。
scattering reads
scattering reads是指資料從一個channel讀取到多個buffer中。如下圖描述:
java nio: scattering read
代碼示例如下:
<code>1</code>
<code>bytebuffer header = bytebuffer.allocate(</code><code>128</code><code>);</code>
<code>2</code>
<code>bytebuffer body = bytebuffer.allocate(</code><code>1024</code><code>);</code>
<code>3</code>
<code>4</code>
<code>bytebuffer[] bufferarray = { header, body };</code>
<code>5</code>
<code>6</code>
<code>channel.read(bufferarray);</code>
注意buffer首先被插入到數組,然後再将數組作為channel.read() 的輸入參數。read()方法按照buffer在數組中的順序将從channel中讀取的資料寫入到buffer,當一個buffer被寫滿後,channel緊接着向另一個buffer中寫。
scattering reads在移動下一個buffer前,必須填滿目前的buffer,這也意味着它不适用于動态消息(譯者注:消息大小不固定)。換句話說,如果存在消息頭和消息體,消息頭必須完成填充(例如 128byte),scattering reads才能正常工作。
gathering writes
gathering writes是指資料從多個buffer寫入到同一個channel。如下圖描述:
java nio: gathering write
<code>//write data into buffers</code>
<code>7</code>
<code>8</code>
<code>channel.write(bufferarray);</code>
buffers數組是write()方法的入參,write()方法會按照buffer在數組中的順序,将資料寫入到channel,注意隻有position和limit之間的資料才會被寫入。是以,如果一個buffer的容量為128byte,但是僅僅包含58byte的資料,那麼這58byte的資料将被寫入到channel中。是以與scattering reads相反,gathering writes能較好的處理動态消息。