java nio Buffer 中 compact的作用
阿新 • • 發佈:2019-02-02
該方法的作用是將 position 與 limit之間的資料複製到buffer的開始位置,複製後 position = limit -position,limit = capacity
但如果position 與limit 之間沒有資料的話發,就不會進行復制
下面舉個例子:
將資料從一個channel 讀取出來,然後寫入另外一個channel
ByteBuffer buffer = ByteBuffer.allocate(4);
如果上面寫的,channel 是一種非阻塞 io 操作,write操作並不能一次將buffer 中的資料全部寫入到指定的 channel 中去,但如果一次寫不完的話while((len=channelSrc.read(buffer))>0) { buffer.flip(); channelDes.write(buffer); // 此時write並不一定一次把buffer中的資料全部發送出去,再次寫資料的時候,我們 //要將 postion System.out.println("read "+len+" bytes"); }*
那麼第二次再讀取的時候,我們就要將 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();
}