Java NIO 開始支援 scatter/gather, scatter/gather 用于描述從 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 中。如下圖描述:
代碼示例如下:
- ByteBuffer header = ByteBuffer.allocate(128);
-
- ByteBuffer body = ByteBuffer.allocate(1024);
-
- ByteBuffer[] bufferArray = { header, body };
-
- channel.read(bufferArray);
注意 buffer 首先被插入到數組,然後再将數組作為 channel.read() 的輸入參數。read()方法按照 buffer 在數組中的順序将從 channel 中讀取的資料寫入到 buffer,當一個 buffer 被寫滿後,channel 緊接着向另一個 buffer 中寫。Scattering Reads 在移動下一個 buffer 前,必須填滿目前的 buffer,這也意味着它不适用于動态消息。換句話說,如果存在消息頭和消息體,消息頭必須完成填充(例如 128byte),Scattering Reads才能正常工作。
Gathering Writes:
Gathering Writes 是指資料從多個 buffer 寫入到同一個 channel。如下圖描述:
代碼示例如下:
- ByteBuffer header = ByteBuffer.allocate(128);
-
- ByteBuffer body = ByteBuffer.allocate(1024);
-
- //write data into buffers
- ByteBuffer[] bufferArray = { header, body };
- channel.write(bufferArray);
buffers 數組是 write()方法的入參,write()方法會按照 buffer 在數組中的順序,将資料寫入到 channel,注意隻有position 和 limit 之間的資料才會被寫入。是以,如果一個 buffer 的容量為 128byte,但是僅僅包含 58byte 的資料,那麼這 58byte 的資料将被寫入到channel 中。是以與 Scattering Reads 相反,Gathering Writes 能較好的處理動态消息。