Java - ByteBuffer字节数组缓冲器。读取数据和写入数据执行flip和clear的原理

ByteBuffer是Java中用于高效读写数据的缓冲区,其内部利用字节数组存储数据。通过offset、limit和position管理数据。flip()方法在读取前将limit设置为position,使position归零,以便从头开始读取;clear()方法则在写入后重置position为0,limit为数组容量,以便再次写入。不执行这些操作可能导致错误的数据读取或追加写入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ByteBuffer继承于Buffer。

使用一个字节数组作为缓冲器。读取的数据和发送的数据会放入字节数组hb中。当数组达到一定大小,一次性写入通道或者读取。避免每次操作都要进行读写操作。

public abstract class ByteBuffer extends Buffer implements Comparable<ByteBuffer>
{
    final byte[] hb;                    /** 非空数组,用于堆缓冲区*/
    final int offset;                   /** 偏移量 */
    boolean isReadOnly;                 /** 是否只读*/
    ...
}

为了方便管理该字节数组,使用了偏移量offset  以及Buffer类中的 

private int mark = -1;           // 标志,可用于恢复重做
private int position = 0;        // 当前位置
private int limit;               // 本次操作最大的字节大小
private int capacity;            // 容量大小
long address;                    // 地址:仅由直接缓冲区使用。

具体原理是,将数据放入字节数组中,并用limit告知本数组中的有效数据大小。position为当前操作的下标。

mark是标志上一次执行完整读取或者存放一系列数据成功之后的下标(需要手动设置),如果本次操作发生错误,则只需要从mark下标处重新操作。不需要从下标0开始。

 

准备从buffer中读取数据时,需要先执行flip()操作。设置关于读取数据的参数。将limit设为有效字符的大小,即上次操作之后的下标position。修改position为0,意为下次从0开始读取数据。mark设为初始值-1;

    /** 用于读取前操作,设置读取的长度limit,下标归0*/
    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

如果不执行flip操作,会导致从末尾进行读取操作,那得到的数据为0,或者为内存中残留数据。

 

与之相对应的,写数据进buff时。需要执行clear()操作。旨在修正各项下标参数为初始值,从0开始写入。

如果不执行clear()操作,直接执行read,那等同于追加操作。

    public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值