Java NIO有內(nèi)置的分散/聚合(Scatter/Gather)功能。分散聚合的概念應(yīng)用場(chǎng)景為從channel讀數(shù)據(jù)妆兑,向channel中寫(xiě)數(shù)據(jù)昙读。
分散的從channel讀取數(shù)據(jù)每强,是將數(shù)據(jù)讀取至多個(gè)buffer中的操作稿静。
那么聚合就是將多個(gè)buffer數(shù)據(jù)寫(xiě)入到一個(gè)channel中。
分散聚合功能在許多場(chǎng)景是很實(shí)用的桶雀。例如一條message矿酵,它由body和header組成,那么你需要將body和header分別存放在兩個(gè)buffer中矗积。這么做可以讓你更方便的使用header和body全肮。
分散讀取
從單個(gè)channel中將數(shù)據(jù)讀取至多個(gè)buffer。下面是示意圖:
下面的代碼棘捣,展示了如何進(jìn)行具體的操作:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
注意buffer首先是如何放入數(shù)組的辜腺,然后bufferArray作為參數(shù)傳入到read()
方法中。read()
方法將數(shù)據(jù)從channel按順序?qū)懭氲綌?shù)組中的buffer中。當(dāng)?shù)谝粋€(gè)buffer寫(xiě)滿后channel會(huì)自動(dòng)去寫(xiě)下一個(gè)buffer哪自。
實(shí)際上丰包,在移動(dòng)到下一個(gè)buffer之前,分散讀取必須填充完當(dāng)前的緩沖區(qū)壤巷,這意味著它不適合動(dòng)態(tài)message的讀取(即message不固定大小)邑彪。換句話說(shuō),假如你有一個(gè)header和body胧华,然后header是固定大小(例如 128 bytes)寄症,那么使用分散讀取是沒(méi)有問(wèn)題的。
聚合寫(xiě)入
聚合讀取是把數(shù)據(jù)從多個(gè)buffer寫(xiě)入到同一個(gè)channel矩动,下面是示意圖:
下面是相關(guān)的代碼示例:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
bufferArray數(shù)組作為參數(shù)傳入到write()
方法有巧,數(shù)組中的buffer,按照順序?qū)懭氲絚hannel中悲没。buffer中的數(shù)據(jù)只有position和limit之間的數(shù)據(jù)可以寫(xiě)出篮迎。所以,如果一個(gè)buffer的容量是128 byte示姿,但是只存了58 byte的數(shù)據(jù)甜橱,那么只會(huì)有58 byte的數(shù)據(jù)會(huì)被寫(xiě)出。所以與分散讀取相反栈戳,聚合寫(xiě)入能較好的處理動(dòng)態(tài)消息岂傲。
想要查看此教程的目錄請(qǐng)點(diǎn)擊:Java NIO教程目錄貼地址