Java NIO(二)缓冲区Buffer

 本文以CharBuffer为例,运行下代码结合注释看,有一个要点是无论什么操作,capacity不会变。

1.Buffer基本属性

    public void testProperties(){
        CharBuffer buffer = CharBuffer.allocate(10);
        //buffer初始状态
        showBuffer(buffer);

        //存入三个字符后
        buffer.put("abc");
        showBuffer(buffer);

        //flip,[position,limit]变成[0,position]
        buffer.flip();
        showBuffer(buffer);

        //读取2个字符后
        char c1 = buffer.get();
        char c2 = buffer.get();
        showBuffer(buffer);

        //clear,恢复成[0,capacity]
        buffer.clear();
        showBuffer(buffer);
    }
    static void showBuffer(CharBuffer buffer){
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < buffer.limit(); i++) {
            char c = buffer.get(i);
            if(c == 0){
                c = '.';
            }
            sb.append(c);
        }
        System.out.printf("position=%d, limit=%d, capacity=%d, content=%s\n",
                buffer.position(),buffer.limit(),buffer.capacity(),sb.toString());
    }

2.读取

    public void testGet(){
        CharBuffer buffer = CharBuffer.allocate(10);
        buffer.put("abc");
        BufferAttr.showBuffer(buffer);
        buffer.flip();

        char[] chars = new char[buffer.remaining()];
        buffer.get(chars);
        System.out.println(chars);
    }

3.mark标记和reset重置到标记处

    public void testMark(){
        CharBuffer buffer = CharBuffer.allocate(10);
        showBuffer(buffer);
        //mark设置为3
        buffer.position(3).mark().position(5);
        showBuffer(buffer);
        //reset,position=mark
        buffer.reset();
        showBuffer(buffer);
    }

4.compact压缩到[position,limit]

    public void testCompact(){
        CharBuffer buffer = CharBuffer.allocate(10);
        buffer.put("abcde");
        buffer.flip();
        //先读取两个字符
        buffer.get();
        buffer.get();
        showBuffer(buffer);
        //压缩
        buffer.compact();
        //继续写入
        buffer.put("fghi");
        buffer.flip();
        showBuffer(buffer);
        //从头读取后续的字符
        char[] chars = new char[buffer.remaining()];
        buffer.get(chars);
        System.out.println(chars);
    }

5.duplicate复制

    //duplicate方法指向同一个内部数组,但分别管理各自的属性
    public void testDuplicate(){
        CharBuffer buffer = CharBuffer.allocate(10);
        buffer.put("abcde");
        CharBuffer buffer1 = buffer.duplicate();
        buffer1.clear();
        buffer1.put("alex");
        showBuffer(buffer);
        showBuffer(buffer1);
    }

6.slice切片

    //slice方法会把buffer切出去一部分形成新的切片,两个buffer共用切片,但分别管理各自的属性
    public void testSlice(){
        CharBuffer buffer = CharBuffer.allocate(20);
        buffer.put("abcdefghij");
        buffer.position(5);
        CharBuffer slice = buffer.slice();
        showBuffer(buffer);
        showBuffer(slice);

        slice.position(5);
        slice.put("kl");
        showBuffer(buffer);
        showBuffer(slice);
    }

参考文章:

https://zhuanlan.zhihu.com/p/25701512

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值