Java NIO帶有內置的scatter和gather支持。scatter和gather是在讀取和寫入Channel中使用的概念。
從Channel的scatter read是將數據讀取到多個緩衝區。因此,將數據從通道“分散”到多個緩衝區中。
gather write到Channel是一種寫操作,它將來自多個緩衝區的數據寫到單個Channel中。因此,將來自多個緩衝區的數據“收集”到一個通道中。
在需要分別處理傳輸數據的各個部分的情況下,scatter和gather可能非常有用。例如,如果消息由標題和正文組成,則可以將標題和正文保留在單獨的緩衝區中。這樣做可以更輕鬆地分別使用標題和正文。
1.Scattering Reads
“分散讀取”將數據從單個通道讀取到多個緩衝區中。這是該原理的說明:
這是一個代碼示例,顯示瞭如何執行分散讀取:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; channel.read(bufferArray);
注意如何將緩衝區首先插入到數組中,然後將數組作爲參數傳遞給channel.read()方法。然後,read()方法按照緩衝區在數組中出現的順序從通道寫入數據。一旦緩衝區已滿,通道將繼續填充下一個緩衝區。
分散讀取會在進入下一個緩衝區之前填滿一個緩衝區,這一事實意味着它不適合動態調整大小。換句話說,如果有標頭和正文,並且標頭是固定大小(例如128字節),則分散讀取適用。
2.Gathering Writes
“聚集寫入”將來自多個緩衝區的數據寫入單個通道。這是該原理的說明:
這是一個代碼示例,顯示瞭如何執行聚集寫入:
ByteBuffer header = ByteBuffer.allocate(128); ByteBuffer body = ByteBuffer.allocate(1024); //write data into buffers ByteBuffer[] bufferArray = { header, body }; channel.write(bufferArray);
緩衝區數組被傳遞到write()方法,該方法按照緩衝區在數組中的順序寫入緩衝區的內容。僅寫入緩衝區的position和limit之間的數據。因此,如果緩衝區的容量爲128個字節,但僅包含58個字節,則只有58個字節從該緩衝區寫入通道。因此,與分散讀取相比,聚集寫入對於動態大小的部分也可以很好地工作。
原文地址: https://www.zhblog.net/go/java/tutorial/java-nio-scatter-gather?t=611