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

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

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 中,這樣你能夠方便的處理消息頭和消息體。併發

1、Scattering Reads

Scattering Reads 是指數據從一個 channel 讀取到多個 buffer 中。以下圖描述:翻譯

Java NIO: Scattering Read

代碼示例以下: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 才能正常工做。教程

2、Gathering Writes

Gathering Writes 是指數據從多個 buffer 寫入到同一個 channel。以下圖描述:get

Java NIO: Gathering Write

代碼示例以下: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

相關文章
相關標籤/搜索