Java IO详解:从IO了解数据缓存的基本思想(二)

Buffer(以ByteBuffer为例)

简介

Buffer是一个线性有序集合,主要有三个标识:capacity, limit, position

**capacity**就是Buffer的容量,不为负且不改变

**limit**标识第一个不能读/写的元素索引,不为负且不大于capacity

**position**标识下一个要被读/写的元素索引不为负且不大于limit

**mark**当reset的时候回到标记的position的位置,不为负且不大于position

0 <= mark <= position <= limit <= capacity

对于每个非boolean的基础类型,都实现了一个Buffer子类,重写了getput方法,并且可以被对应的channel操作

每个Buffer都实现了readable但不一定实现了writable,并且是线程不安全的,对于并发多线程访问,应该实现同步控制

主要的三个方法:clear, flip, rewind

源码真的很简单,这里只搞懂怎么实现的图示就OK

初始化

mark的默认值是-1,初始化主要检查0 <= mark <= position <= limit <= capacity关系

private int mark = -1;
private int position = 0;
private int limit;
private int capacity;

Buffer(int mark, int pos, int lim, int cap) {       // package-private
    if (cap < 0)
        throw new IllegalArgumentException("Negative capacity: " + cap);
    this.capacity = cap;
    limit(lim);
    position(pos);
    if (mark >= 0) {
        if (mark > pos)
            throw new IllegalArgumentException("mark > position: ("
                                               + mark + " > " + pos + ")");
        this.mark = mark;
    }
}

示例:

CharBuffer charBuffer = CharBuffer.allocate(16);
allocate 方法调用了HeapCharBuffer,默认mark=-1,position=0,limit=capacity;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZFUDGdrN-1628528570409)(image\BufferInit.jpg)]

put()写入

每放一个元素,position后移一位

charBuffer.put("Hello,World".toCharArray());

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02BfXBmQ-1628528570411)(image\BufferPut.jpg)]

flip(),切换为读就绪状态

charBuffer.flip();

limit切到position位置,position切到首位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ut3rLIsN-1628528570411)(image\BufferFlip.jpg)]

get()读取

每读取一次元素,positio后移一位

charBuffer.get();//循环调用5次,读取"Hello"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Di0AY3Od-1628528570413)(image\BufferGet.jpg)]

Mark()标记,reset()恢复标记位

mark()将mark置于position位置,reset()重新将position恢复到mark位置

charBuffer.mark()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lwzcUmI-1628528570414)(image\BufferMark.jpg)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值