?? .Scattering Reads(分散讀)
?? .Gathering Writes(聚集寫)
Java NIO內(nèi)置了對scatter和gather的支持。 Scatter和gather都是用于描述從channel中讀或?qū)憽?/p>
從channel中進行scattering? read也是一個讀操作,只不過它會把數(shù)據(jù)讀取到多個buffer中而不僅僅是單個buffer中。因此,該channel就把數(shù)據(jù)scatter到多個buffer中去。
同理,向一個channel中進行gathering write 也是一個寫操作,它會把來自多個buffer中的數(shù)據(jù)寫入到一個單一的channel中。因此,該channel就把來自多個buffer中的數(shù)據(jù)聚集進一個channel中啦。
Scatter和gather在某些情況下下是否有用,你想分別處理所提交數(shù)據(jù)的不同部分。例如,如果一個消息由一個header頭和一個body體構成,你可能想把header頭和body體放入到不同的buffer中。這樣做的話,可以讓你更方便地分別header和body。
一、Scattering Reads
ScatteringRead會把單個channel中的數(shù)據(jù)讀入到多個buffer中。下面有一個Scatter原則的圖例:
下面的代碼展示了如何執(zhí)行一個scattering read:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body? = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
請注意看一下,buffer首先被插入到一個array中,然后這個數(shù)組作為參數(shù)傳遞給channel.read()方法。然后read()方法會把channel中的數(shù)據(jù)按順序?qū)懭氲綌?shù)組中的buffer中。一旦一個buffer滿了之后,channel就轉向?qū)懭氲较乱粋€buffer中。
事實上,scatter讀在移向下一個buffer之前會先填充滿上一個buffer,這也就是意味著,它不適于處理動態(tài)大小的消息。換句話說,如果你有一個header和一個body,header是固定大小(比如,128個字節(jié)),那么scatteringRead就可以很好地工作。
二、Gathering Write
聚集寫可以多個buffer中的數(shù)據(jù)寫入到一個單一的channel中。下面是該原則的一個圖例:
下面打一段代碼展示了如何執(zhí)行聚集寫:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body? = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
可以看到,一個buffer數(shù)組被傳遞給write()方法,它會按照數(shù)組中的順序把buffer中的內(nèi)容寫入到channel中。注意:只有buffer中處于position和limit之間數(shù)據(jù)被寫入。
因此,如果一個buffer的容量是128個字節(jié),但是只包含58個字節(jié),那么該buffer中只有58個字節(jié)的數(shù)據(jù)被寫入到channel中。因此,相比較于scattering read,聚集寫在處理動態(tài)大小的消息部分時,照樣工作的很好。