Java NIO allocate、put、flip、get、rewind、clear、mark、reset

Java NIO系统的核心在于:通道(channel)和缓冲区(buffer)。通道表示打开到IO设备的连接。若需要使用NIO系统,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。

Channel负责传输,Buffer负责存储。

缓冲区(Buffer):在Java NIO中负责数据的存储,缓冲区就是数组,用于存储不同数据类型的数据。根据数据类型不同,提供了相应类型的缓冲区(boolean除外)。所有缓冲区都是Buffer类型的子类

  • allocate() 获取缓冲区
  • put() 存入数据到缓冲区
  • get() 从缓冲区取出数据

缓冲区的四个核心属性:

  • capacity:容量,表示缓冲区最大数据存储的容量,一旦声明不可改变(底层数组)
  • limit:界限,表示缓冲区中可以操作数据的大小。limit外的数据不能进行读写
  • position:位置,表示缓冲区中正在吃哦做数据的位置。0 <= mark <= position <= limit <= capacity
  • mark:记录,表示记录当前position的位置,可以通过reset()方法恢复到mark的位置

在这里插入图片描述

	@Test
    public void bufferTest() {
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        System.out.println("============allocate===============");
        System.out.println("position:" + buffer.position()); //0
        System.out.println("limit:" + buffer.limit()); //1024
        System.out.println("capacity:" + buffer.capacity()); //1024

        System.out.println("============put===============");
        String str = "abcde";
        buffer.put(str.getBytes());
        System.out.println("position:" + buffer.position()); //5
        System.out.println("limit:" + buffer.limit()); //1024
        System.out.println("capacity:" + buffer.capacity()); //1024

        System.out.println("============flip===============");
        buffer.flip();
        System.out.println("position:" + buffer.position()); //0
        System.out.println("limit:" + buffer.limit()); //5
        System.out.println("capacity:" + buffer.capacity()); //1024

        System.out.println("============get===============");
        byte dst[] = new byte[buffer.limit()];
        buffer.get(dst);
        System.out.println(new String(dst, 0, dst.length)); //abcde
        System.out.println("position:" + buffer.position()); //5
        System.out.println("limit:" + buffer.limit()); //5
        System.out.println("capacity:" + buffer.capacity()); //1024


        System.out.println("============rewind===============");
        //可重复读
        buffer.rewind();
        System.out.println("position:" + buffer.position()); //0
        System.out.println("limit:" + buffer.limit()); //5
        System.out.println("capacity:" + buffer.capacity()); //1024

        System.out.println("============clear===============");
        //清空缓冲区,数据不清空
        buffer.clear();
        System.out.println("position:" + buffer.position()); //0
        System.out.println("limit:" + buffer.limit()); //1024
        System.out.println("capacity:" + buffer.capacity()); //1024
    }

在这里插入图片描述

	@Test
    public void markTest() {
        ByteBuffer buffer = ByteBuffer.allocate(1024);

        String str = "abcde";
        buffer.put(str.getBytes());

        buffer.flip();

        System.out.println("============get1===============");
        byte dst1[] = new byte[buffer.limit()];
        buffer.get(dst1, 0, 2);
        System.out.println(new String(dst1, 0, dst1.length));
        System.out.println("position:" + buffer.position()); //2
        System.out.println("limit:" + buffer.limit()); //5
        System.out.println("capacity:" + buffer.capacity()); //1024

        buffer.mark();

        System.out.println("============get2===============");
        byte dst2[] = new byte[buffer.limit()];
        buffer.get(dst2, 0, 2);
        System.out.println(new String(dst2, 0, dst2.length));
        System.out.println("position:" + buffer.position()); //4
        System.out.println("limit:" + buffer.limit()); //5
        System.out.println("capacity:" + buffer.capacity()); //1024

        System.out.println("============reset===============");
        buffer.reset();
        System.out.println("position:" + buffer.position()); //2
        System.out.println("limit:" + buffer.limit()); //5
        System.out.println("capacity:" + buffer.capacity()); //1024

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值