1. 程式人生 > >java nio Buffer 中 compact的作用

java nio Buffer 中 compact的作用

該方法的作用是將 position 與 limit之間的資料複製到buffer的開始位置,複製後 position  = limit -position,limit = capacity

但如果position 與limit 之間沒有資料的話發,就不會進行復制

下面舉個例子:

將資料從一個channel 讀取出來,然後寫入另外一個channel 

ByteBuffer buffer  = ByteBuffer.allocate(4);

while((len=channelSrc.read(buffer))>0) {
	    buffer.flip();
	    channelDes.write(buffer);
	    // 此時write並不一定一次把buffer中的資料全部發送出去,再次寫資料的時候,我們
	    //要將 postion
	    System.out.println("read "+len+" bytes");
	}*
如果上面寫的,channel 是一種非阻塞 io 操作,write操作並不能一次將buffer 中的資料全部寫入到指定的 channel 中去,但如果一次寫不完的話

那麼第二次再讀取的時候,我們就要將 position = limit ,limit = capacity ,然後再讀取,不然第二次讀取的資料會把第一次沒有write 完的資料覆蓋掉,

等設定後第二次讀取完成後,我們還是要向channel 中write 資料,然後這次寫入資料還要從上一次沒有寫完的地方開始寫,我們還要將position 還原到上一步記錄的地方

然後將limit 設定成 最後一次 position 的位置,這樣做在複雜,因此提供了一個 compact 操作,我們在 write 後,執行 buffer.compact()將沒有發出的資料複製到 buffer 

的開始位置,posittion = limit-position,limit = capacity,這樣在下一次read(buffer)的時候,資料就會繼續新增到緩衝的後面了

;因此標準的從一個channel 的資料到另一個 channel 的操作是這樣的

while(channelread.read(buffer)>0 || buffer.position ==0){

buffer.flip();

channelwriter.write(buffer);

buffer.compact();

}