天天看點

四、Nio之Scatter(分散)/Gather(聚集)

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 中。如下圖描述:

四、Nio之Scatter(分散)/Gather(聚集)

代碼示例如下:

  1. ByteBuffer header = ByteBuffer.allocate(128);
  2. ByteBuffer body = ByteBuffer.allocate(1024);
  3. ByteBuffer[] bufferArray = { header, body };
  4. 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。如下圖描述:

四、Nio之Scatter(分散)/Gather(聚集)

代碼示例如下:

  1. ByteBuffer header = ByteBuffer.allocate(128);
  2. ByteBuffer body = ByteBuffer.allocate(1024);
  3. //write data into buffers
  4. ByteBuffer[] bufferArray = { header, body };
  5. channel.write(bufferArray);

buffers 數組是 write()方法的入參,write()方法會按照 buffer 在數組中的順序,将資料寫入到 channel,注意隻有position 和 limit 之間的資料才會被寫入。是以,如果一個 buffer 的容量為 128byte,但是僅僅包含 58byte 的資料,那麼這 58byte 的資料将被寫入到channel 中。是以與 Scattering Reads 相反,Gathering Writes 能較好的處理動态消息。

繼續閱讀