程序员社区

NIO中Buffer缓冲区的核心要点

一.buffer缓冲区核心要点

我们来看看Buffer缓冲区有什么值得我们注意的地方。

Buffer是缓冲区的抽象类:

NIO中Buffer缓冲区的核心要点插图
buffer抽象类源码.jpg

其中ByteBuffer是用得最多的实现类(在管道中读写字节数据)。

NIO中Buffer缓冲区的核心要点插图1
buffer实现类.jpg

拿到一个缓冲区我们往往会做什么?很简单,就是读取缓冲区的数据/写数据到缓冲区中。所以,缓冲区的核心方法就是:

  • put()
  • get()

Buffer类维护了4个核心变量属性来提供关于其所包含的数组的信息。它们是:

  • 容量Capacity
    • 缓冲区能够容纳的数据元素的最大数量。容量在缓冲区创建时被设定,并且永远不能被改变。(不能被改变的原因也很简单,底层是数组嘛)
  • 上界Limit
    • 缓冲区里的数据的总数,代表了当前缓冲区中一共有多少数据。
  • 位置Position
    • 下一个要被读或写的元素的位置。Position会自动由相应的 get( )put( )函数更新。
  • 标记Mark
    • 一个备忘位置。用于记录上一次读写的位置
NIO中Buffer缓冲区的核心要点插图2
buffer要点.jpg

二.buffer代码演示

首先展示一下是如何创建缓冲区的,核心变量的值是怎么变化的


    public static void main(String[] args) {

        // 创建一个缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

        // 看一下初始时4个核心变量的值
        System.out.println("初始时-->limit--->"+byteBuffer.limit());
        System.out.println("初始时-->position--->"+byteBuffer.position());
        System.out.println("初始时-->capacity--->"+byteBuffer.capacity());
        System.out.println("初始时-->mark--->" + byteBuffer.mark());

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

        // 添加一些数据到缓冲区中
        String s = "Java3y";
        byteBuffer.put(s.getBytes());

        // 看一下初始时4个核心变量的值
        System.out.println("put完之后-->limit--->"+byteBuffer.limit());
        System.out.println("put完之后-->position--->"+byteBuffer.position());
        System.out.println("put完之后-->capacity--->"+byteBuffer.capacity());
        System.out.println("put完之后-->mark--->" + byteBuffer.mark());
    }
复制代码

运行结果:

NIO中Buffer缓冲区的核心要点插图3
初始时4个核心变量的值

现在我想要从缓存区拿数据,怎么拿呀??NIO给了我们一个flip()方法。这个方法可以改动position和limit的位置

还是上面的代码,我们flip()一下后,再看看4个核心属性的值会发生什么变化:

NIO中Buffer缓冲区的核心要点插图4
flip之后

很明显的是:

  • limit变成了position的位置了
  • 而position变成了0

看到这里的同学可能就会想到了:当调用完filp()时:limit是限制读到哪里,而position是从哪里读

一般我们称filp()切换成读模式

  • 每当要从缓存区的时候读取数据时,就调用filp()切换成读模式
NIO中Buffer缓冲区的核心要点插图5
buffer结构.jpg

切换成读模式之后,我们就可以读取缓冲区的数据了:


        // 创建一个limit()大小的字节数组(因为就只有limit这么多个数据可读)
        byte[] bytes = new byte[byteBuffer.limit()];

        // 将读取的数据装进我们的字节数组中
        byteBuffer.get(bytes);

        // 输出数据
        System.out.println(new String(bytes, 0, bytes.length));

随后输出一下核心变量的值看看:

NIO中Buffer缓冲区的核心要点插图6
核心变量的变化.jpg

读完我们还想写数据到缓冲区,那就使用clear()函数,这个函数会“清空”缓冲区:

  • 数据没有真正被清空,只是被遗忘掉了
NIO中Buffer缓冲区的核心要点插图7
clear之后.jpg

参考自:https://juejin.im/post/5af942c6f265da0b7026050c

赞(0) 打赏
未经允许不得转载:IDEA激活码 » NIO中Buffer缓冲区的核心要点

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区