NIO中Buffer缓冲区的核心要点

2019-05-02  本文已影响0人  叫我不矜持

一.buffer缓冲区核心要点

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

Buffer是缓冲区的抽象类:

buffer抽象类源码.jpg

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

buffer实现类.jpg

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

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

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());
    }
复制代码

运行结果:

初始时4个核心变量的值

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

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

flip之后

很明显的是:

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

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

buffer结构.jpg

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


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

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

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

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

核心变量的变化.jpg

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

clear之后.jpg

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

上一篇 下一篇

猜你喜欢

热点阅读