Java NIO Scatter 和 Gather

Java NIO帶有內置的scatter和gather支持。scatter和gather是在讀取和寫入Channel中使用的概念。

從Channel的scatter read是將數據讀取到多個緩衝區。因此,將數據從通道“分散”到多個緩衝區中。

gather write到Channel是一種寫操作,它將來自多個緩衝區的數據寫到單個Channel中。因此,將來自多個緩衝區的數據“收集”到一個通道中。

在需要分別處理傳輸數據的各個部分的情況下,scatter和gather可能非常有用。例如,如果消息由標題和正文組成,則可以將標題和正文保留在單獨的緩衝區中。這樣做可以更輕鬆地分別使用標題和正文。

 

1.Scattering Reads

“分散讀取”將數據從單個通道讀取到多個緩衝區中。這是該原理的說明:

scatter.png

 

這是一個代碼示例,顯示瞭如何執行分散讀取:

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);

ByteBuffer[] bufferArray = { header, body };

channel.read(bufferArray);

 

注意如何將緩衝區首先插入到數組中,然後將數組作爲參數傳遞給channel.read()方法。然後,read()方法按照緩衝區在數組中出現的順序從通道寫入數據。一旦緩衝區已滿,通道將繼續填充下一個緩衝區。

分散讀取會在進入下一個緩衝區之前填滿一個緩衝區,這一事實意味着它不適合動態調整大小。換句話說,如果有標頭和正文,並且標頭是固定大小(例如128字節),則分散讀取適用。

 

2.Gathering Writes

“聚集寫入”將來自多個緩衝區的數據寫入單個通道。這是該原理的說明:

gather.png

 

這是一個代碼示例,顯示瞭如何執行聚集寫入:

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章