我是靠谱客的博主 糟糕钥匙,最近开发中收集的这篇文章主要介绍Java IO详解:从IO了解数据缓存的基本思想(二)Buffer(以ByteBuffer为例),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Buffer(以ByteBuffer为例)

文章目录

  • Buffer(以ByteBuffer为例)
    • 简介
    • 初始化
    • put()写入
    • flip(),切换为读就绪状态
    • get()读取
    • Mark()标记,reset()恢复标记位

简介

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)(imageBufferInit.jpg)]

put()写入

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

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

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

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

charBuffer.flip();

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

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

get()读取

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

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

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

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

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

charBuffer.mark()

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

最后

以上就是糟糕钥匙为你收集整理的Java IO详解:从IO了解数据缓存的基本思想(二)Buffer(以ByteBuffer为例)的全部内容,希望文章能够帮你解决Java IO详解:从IO了解数据缓存的基本思想(二)Buffer(以ByteBuffer为例)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部