5 Java NIO Scatter 與Gather-翻譯

王金龍發表於2017-12-06

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中。下圖說明了這個原則。

image
下面是一個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。如下圖描述:

image

下面的程式碼是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非常適合動態長度的訊息體。

相關文章