NIO buffer机制和使用

基本介绍

缓冲区(buffer):buffer本质上是一个可以读写的内存块,可以理解成是一个容器,该容器提供了一系列的方法,可以轻松的使用内存块。缓冲区中内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel提供了从文件、网络中读取数据的渠道,但是读写数据都必须经由buffer。
image.png

Buffer类及其子类

Buffer类定义了所有缓冲区都具有的四个属性来提供关于其所包含的数据信息:

    /**
      标记
    */
    private int mark = -1;
    /**
    位置。下一个要被读或者写的元素的索引,每次读写数据都会改变  该值
    */
    private int position = 0;
    /**
   表示缓冲区的当前终点,不能对超过该值的位置进行读写
    */
    private int limit;
    /**
     容量,既可以容纳的最大数据量,在缓冲区创建时设定且不能改变
    */
    private int capacity;

遵循这样的不变关系:mark <= position <= limit <= capacity
相关方法及说明:


image.png

注意事项:

当我们使用get()方法去读取缓冲区的数据时,需要调用flip()方法,表示反转缓冲区,否则会出现BufferUnderflowException异常。看下filp()方法以及get()代码:

//反转缓冲区,如果调用前时put方法,反转之后,
// position置为0,即读游标为0,且可读长度为limit
public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

public byte get() {
        return hb[ix(nextGetIndex())];
    }

//每次get()读取之后,position加一
final int nextGetIndex() {                         
        if (position >= limit)
            throw new BufferUnderflowException();
        return position++;
    }

如果是调用get(int index),通过下标读取不会改变position的值,则不会出现BufferUnderflowException异常。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容