1. 程式人生 > >NIO buffer中clear、compact方法的區別

NIO buffer中clear、compact方法的區別

呼叫clear()方法:position將被設回0,limit設定成capacity,換句話說,Buffer被清空了,其實Buffer中的資料並未被清除,只是這些標記告訴我們可以從哪裡開始往Buffer裡寫資料。如果Buffer中有一些未讀的資料,呼叫clear()方法,資料將“被遺忘”,意味著不再有任何標記會告訴你哪些資料被讀過,哪些還沒有。如果Buffer中仍有未讀的資料,且後續還需要這些資料,但是此時想要先寫些資料,那麼使用compact()方法。compact()方法將所有未讀的資料拷貝到Buffer起始處。然後將position設到最後一個未讀元素正後面。limit屬性依然像clear()方法一樣,設定成capacity。

現在Buffer準備好寫資料了,但是不會覆蓋未讀的資料。

package NIO;

import java.nio.CharBuffer;

/**
 * @ClassName BufferTest
 * @Description TODO
 * @Author Kikityer
 * @Date 2018/10/18 11:25
 * @Version 1.0.0
 **/
public class BufferTest {
    public static void main(String[] args) {

        CharBuffer charBuffer = CharBuffer.allocate(8);
        System.out.println(charBuffer.capacity());  //8
        System.out.println(charBuffer.limit());     //8
        System.out.println(charBuffer.position());  //0

        charBuffer.put('a');
        charBuffer.put('b');
        charBuffer.put('c');
        System.out.println(charBuffer.position());  //3

        charBuffer.flip();//寫模式轉到讀模式
        System.out.println(charBuffer.limit());     //3
        System.out.println(charBuffer.position());  //0

        System.out.println("取出第一個元素是:"+charBuffer.get());  //a
        System.out.println("取完第一個元素之後,position的變化:"+charBuffer.position());  //1

        charBuffer.clear();//取完第一個元素之後,執行clear方法,重新為寫操作做準備
        System.out.println(charBuffer.position());  //0
        System.out.println(charBuffer.get());    //a 事實證明clear之後。之前的元素還在,並未被清空。當有新的元素進來時才會將其覆蓋。
        System.out.println(charBuffer.get(1));   //b
        System.out.println(charBuffer.get(2));   //c
        System.out.println(charBuffer.limit());     //8

        System.out.println("---------------------");
        charBuffer.clear();
        charBuffer.put('d');
        charBuffer.put('e');
        charBuffer.put('f');
        charBuffer.flip();
        System.out.println(charBuffer.position());  //0
        System.out.println(charBuffer.limit());     //3
        System.out.println(charBuffer.get());       //d
        System.out.println(charBuffer.get(1));      //e
        System.out.println(charBuffer.get(2));      //f

    }
}