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

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

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开始。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值