java nio 学习之 Buffer 类

之前听别人说java nio,以为是封装的多线程处理io,提高并发能力,支持批量下载,今天了解才发现是java new io.

主要包括3个核心 : buffer(走缓冲),selector(选择器,将IO阻塞调整为选择阻塞,这样网络请求就不至于阻塞,只是后台任务堆积),channel(通道)

先学习Buffer.

Buffer主要是几个基本类型的Buffer,例如intBuffer,ByteBuffer等,今天以IntBuffer实现各个方法的说明,和各个可能碰到的坑点的碰撞。


package javaNioTest;

import java.nio.IntBuffer;
import java.util.HashMap;
import java.util.Map;

public class BufferStudy {

    public static void main(String args[]) {
        IntBuffer intBuffer = IntBuffer.allocate(8);
        System.out.println("初始intBuffer的限制为:" + intBuffer.limit());
        for (int i = 1; i < intBuffer.capacity(); i++) {
            System.out.println("当前位置至limit中的元素数量:" + intBuffer.remaining());
            intBuffer.put(i);
        }
        intBuffer.flip();
        for (int i = 1; i <= intBuffer.limit(); i++) {
            System.out.println("当前数组偏移量:" + intBuffer.arrayOffset() + "\t第" + i + "个值为" + intBuffer.get());
        }
        intBuffer.limit(5);
        System.out.println("将limit置为5后的限制值:" + intBuffer.limit());
        // 当偏移量大于limit后我们看下获取的元素数量和下一个值会是多少
        System.out.println("position=7,limit=5时,remaining()返回值:" + intBuffer.remaining());
        // System.out.println("position=7,limit=5时,读取下一个值:" + intBuffer.get());异常了
        System.out.println("position=7,limit=5时,读取返回值:" + intBuffer.get(3));
        intBuffer.limit(5);
        intBuffer.clear(); // position \ limit \ capacity 恢复初始化,值还存在
        System.out.println("原来位置为7,clear后intbuffer的position为:" + intBuffer.position());
        System.out.println("原来限制为5,clear后intbuffer的限制为:" + intBuffer.limit());
        System.out.println("clear后intbuffe的还有值吗?" + intBuffer.hasRemaining());
        while (intBuffer.hasRemaining()) {
            System.out.println("clear后值:" + intBuffer.get());
        }
        // 测试rewind();
        intBuffer.clear();
        intBuffer.position(2);
        int p1 = intBuffer.position();
        intBuffer.limit(5);
        intBuffer.rewind();
        System.out.println("原来位置为" + p1 + ",rewind后intbuffer的position为:" + intBuffer.position());
        System.out.println("原来限制为5,rewind后intbuffer的限制为:" + intBuffer.limit());
        System.out.println("rewind后intbuffe的还有值吗?" + intBuffer.hasRemaining());
        while (intBuffer.hasRemaining()) {
            System.out.println("rewind后值:" + intBuffer.get());
        }

        // 测试flip()
        intBuffer.clear();
        intBuffer.get(2);
        int p2 = intBuffer.position();
        System.out.println(p2 + "/t当前位置值:" + intBuffer.get());
        intBuffer.position(2);
        int p3 = intBuffer.position();
        intBuffer.limit(5);
        intBuffer.flip();
        System.out.println("原来位置为" + p3 + ",flip后intbuffer的position为:" + intBuffer.position());
        System.out.println("原来限制为5,flip后intbuffer的限制为:" + intBuffer.limit());
        System.out.println("flip后intbuffe的还有值吗?" + intBuffer.hasRemaining());
        while (intBuffer.hasRemaining()) {
            System.out.println("flip后值:" + intBuffer.get());
        }
        // 测试Map.clear
        Map<String, String> sa = new HashMap<String, String>();
        sa.put("sd", null);
        sa.clear();
        System.out.println(sa.size());
    }

    /**
     * 结论 :
     * 1、第13行输出说明, buffer.remaining()返回的是limit-position的值,包含当前位置的值,但不代表自己存放进去的值的个数
     * 2、第24行抛出异常说明, 读取值得时候position不能大于limit
     * 3、第25行输出说明, intBuffer.get(index),index是从0开始的,同时介绍说明 index<limit才不会异常
     * 4、第30行输出说明, 对于intBuffer,如果我们没有放入值,那么获取到的不是null,而是0
     * 5、第28、29、30、32说明, buffer.clear() 将position置为0,limit置为容量大小,但是值还存在。 (初始化)
     * 6、第40、41、42行说明, buffer.rewind() 将position置0,limit不变,capacity不变 (重读)
     * 7、第56、57、58行说明, buffer.flip() 将position置0,limit置为之前position位置-1(取之前position前面区域,不包括position)
     * 8、第49、50、51行说明, buffer.get(index),会取出position=index的值,当时position不会改变
     */
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值