Java NIO 開始支持 scatter/gather,scatter/gather 用於描述從 Channel(譯者注:Channel 在中文常常翻譯爲通道)中讀取或者寫入到 Channel 的操做。java
Scatter(分散)
從 Channel 中讀取是指在讀操做時將讀取的數據寫入多個 buffer 中。所以,Channel 將從 Channel 中讀取的數據「分散(scatter)」到多個 Buffer 中。編程
Gather(彙集)
寫入 Channel 是指在寫操做時將多個 buffer 的數據寫入同一個 Channel,所以,Channel 將多個 Buffer 中的數據「彙集(gather)」後發送到 Channel。數組
Scatter 和 Gather 常常用於須要將傳輸的數據分開處理的場合,例如傳輸一個由消息頭和消息體組成的消息,你可能會將消息體和消息頭分散到不一樣的 buffer 中,這樣你能夠方便的處理消息頭和消息體。併發
Scattering Reads 是指數據從一個 channel 讀取到多個 buffer 中。以下圖描述:翻譯
代碼示例以下:code
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 中寫。blog
Scattering Reads 在移動下一個 buffer 前,必須填滿當前的 buffer,這也意味着它不適用於動態消息(譯者注:消息大小不固定)。換句話說,若是存在消息頭和消息體,消息頭必須完成填充(例如 128byte),Scattering Reads 才能正常工做。教程
Gathering Writes 是指數據從多個 buffer 寫入到同一個 channel。以下圖描述:get
代碼示例以下:it
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 能較好的處理動態消息。
轉載自併發編程網 – ifeve.com,本文連接地址: Java NIO系列教程(四) Scatter/Gather