天天看點

Java NIO系列教程(四) Scatter/Gather

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系列教程(四) Scatter/Gather

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系列教程(四) Scatter/Gather

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能較好的處理動态消息。