Java NIO開始支援scatter與gatter。scatter與gatter用於實現從Channel讀資料和向通道寫資料。
scatter從一個通道讀取資料並寫入到多個Buffer中。因此,scatter實現將通道中的資料寫入到多個Buffer中去。
gatter負責將多個buffer中的資料寫入到一個channel。因此,gatter實現將多個buffer中的資料聚集到一個channel中去。
scatter和gatter經常用於將需要傳輸的資料分開處理的場合,例如,如果一條訊息由訊息頭跟訊息體組成,你經常需要將訊息頭與訊息體放在不同的buffer中,這樣你可以更加方便地處理訊息頭跟訊息體。
Scattering Reads
"scattering read"是將一個Channel的資料讀入到多個Buffer中。下圖說明了這個原則。
下面是一個scatter read的一個例子。ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
複製程式碼
注意到buffer首先被插入到陣列,然後將陣列作為引數傳遞給channel.read()方法。read方法按照buffer在陣列中的順序依次讀取。當一個buffer滿了以後,就往下一個buffer中寫資料。
scattering reads在移動到下一個buffer之前會先寫滿當前buffer。這意味著它不適合動態訊息體的情況。換句話說,如果你有一個訊息頭和訊息體,並且訊息頭的長度是固定的,那麼scattering read將會非常適合。
Gathering Writes
"gathering write"是從多個buffer中寫入資料到單個channel。如下圖描述:
下面的程式碼是gathering write的一個例子。
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);
複製程式碼
buffer陣列會傳遞給write方法,它會按照buffer在陣列中的順序依次寫入到channel。只有在position和limit之間的資料才會被寫入。因此,如果一個buffer的長度為128個位元組,但只包含58個位元組內容,只有58個位元組的內容會被寫入到channel。因此,與scattering reads相反,gathering write非常適合動態長度的訊息體。