天天看點

3.java語言實作socket程式設計之NIO-buffer的api

buffer對象的api實作案例

buffer的基本操作

//1.基本操作
        //建立指定長度的緩沖區,類似c語言的malloc函數。一旦定義cap容量不變。
        IntBuffer buffer = IntBuffer.allocate(10);
        //初始化之後,buffer的列印狀态[pos=0 lim=10 cap=10]
        System.out.println("init buffer = " + buffer);
        //put,寫入方法,會影響pos的位置,不影響limit的位置
        buffer.put(1);//pos:0---》1
        buffer.put(2);//pos:1--》2
        buffer.put(3);//pos:2---》3
        //[pos=3 lim=10 cap=10]
        System.out.println("buffer after put= " + buffer);
        //複位buffer,即pos置為0,limit設定為實際的元素數量,可以了解為讀寫的模式的切換。
        buffer.flip();
        //複位buffer之後,[pos=0 lim=3 cap=10]
        System.out.println("buffer after flip= " + buffer);
        //讀取下表為1的元素,下标是從0開始的。取出來2
        System.out.println("buffer[1] = " + buffer.get(1));
        //get之後,pos位置不變[pos=0 lim=3 cap=10]
        System.out.println("buffer after get = " + buffer);
        //指定位置放入元素
        buffer.put(1,4);
        //指定位置放入元素,pos位置不變。
        System.out.println("buffer after put(index,change)= " + buffer);
        //周遊buffer中的元素
        for (int i = 0; i < buffer.limit(); i++) {
            //get方法執行一次,pos++
            System.out.println(buffer.get());
        }      

wrap(包裹)方法的使用

//2.wrap方法的使用
        //wrap方法會包裹一個數組:一般這種方法不會先初始化緩存對象的長度,因為沒有意義。
        // 最後還是會被wrap所包裹的數組覆寫掉。
        //并且wrap對象修改緩沖區對象的時候,數組本身也發生着變化。
        int[] arr = new int[]{1,2,5};
        IntBuffer buffer1  = IntBuffer.wrap(arr);
        System.out.println("buffer1 = " + buffer1);
        //還可以選擇具體的部分元素存入buffer中,這種寫法是放入第1,2個元素。
        IntBuffer buffer2 = IntBuffer.wrap(arr,0,2);
        //這種使用方式,buffer的容量為數組的長度3,但是可操作元素隻有放入的2個。是以wrap方法改變limit
        System.out.println("buffer2 = " + buffer2);      

其他方法

//3.其他方法
        //往緩沖區中放入具體的數組[pos=3 lim=10 cap=10]
        IntBuffer buffer = IntBuffer.allocate(10);
        int[] arr = new int[]{1,2,4};
        buffer.put(arr);
        System.out.println("buffer = " + buffer);
        //實作複制:[pos=3 lim=10 cap=10]
        IntBuffer buffer1 = buffer.duplicate();
        System.out.println("buffer1 = " + buffer1);
        //定位pos屬性的方法:[pos=1 lim=10 cap=10]
        buffer.position(1);
        System.out.println("buffer = " + buffer);
        //找到刻度資料remaining,limit-pos獲得該資料,含義為可讀資料。
        System.out.println("buffer.remaining = " + buffer.remaining());
        //将緩沖區的資料放入數組中備用
        int[] arr2 = new int[buffer.remaining()];
        buffer.get(arr2);
        for (int i:arr2) {
            System.out.println("i = " + i);
        }