JAVA ByteBuffer理解小结

重要字段

capacity:容量,最多容纳多少个字节

limit: 0=<limit<=Capacity

position: 当前指针位置,从0向上增长。如果postion大于limit,Java会报出异常。

 

重要方法

get()获取一个数据,并且,移动position

get(i) 获取一个指定位置数据,但是,不移动position

remaining:还剩多少字节可以读取。

flip:让limit指向正确的位置。

compact:压缩掉已经完成读取的数据。

 

flip和compact是我之前不太容易理解的函数。

compact:读取一段数据之后,调用campact,这时候position = limit,limit=capacity 可以继续read(向buffer写入数据)了。这可以保证写入不会溢出,也不会覆盖掉有用的数据。

flip:如果想要继续读取数据,需要调用一次flip,这样limit = position,position = 0, 这可以保证读取的正确性。

这就是flip和compact的用法。

 

更通俗点讲:

compact压缩空间并保证读取正确性,compact+flip 压缩空间并保证读取正确性。单为写入准备,只调用compact即可。移动并继续读取,需要先调用compact进行压缩,在通过flip方法,将position和limit设置到正确位置。

实例代码:

    public  static  void main( String [] args )
    {
        byte [] byte_array = new byte[10];
        for( int i = 0;i<10; i++)
        {
            byte_array[i] = (byte)(i+1);
        }

        ByteBuffer bbufer = ByteBuffer.wrap(byte_array);

        System.out.println(bbufer);

        System.out.println("get for 3 times");
        System.out.println( bbufer.get());
        System.out.println( bbufer.get());
        System.out.println( bbufer.get());

        System.out.println("---Compact---");
        bbufer.compact();
        System.out.println(bbufer);

        bbufer.put((byte)(11));
        bbufer.put((byte)(12));

        System.out.println("---flip---");
        bbufer.flip();
        System.out.println(bbufer);

        System.out.println("get for 3 times");
        System.out.println( bbufer.get());
        System.out.println( bbufer.get());
        System.out.println( bbufer.get());

        System.out.println("---Compact---");
        bbufer.compact();
        System.out.println(bbufer);

        System.out.println("---flip---");
        bbufer.flip();
        System.out.println(bbufer);

        System.out.println("get for 6 times");
        System.out.println( bbufer.get());
        System.out.println( bbufer.get());
        System.out.println( bbufer.get());
        System.out.println( bbufer.get());
        System.out.println( bbufer.get());
        System.out.println( bbufer.get());

        System.out.println(bbufer);
        System.out.println("remaining:"+bbufer.remaining());

        System.out.println("---Compact---");
        bbufer.compact();
        System.out.println(bbufer);

        System.out.println("---flip---");
        bbufer.flip();
        System.out.println(bbufer);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章