我是靠谱客的博主 糟糕钥匙,这篇文章主要介绍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关系

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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; } }

示例:

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

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

put()写入

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

复制代码
1
2
charBuffer.put("Hello,World".toCharArray());

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

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

复制代码
1
2
charBuffer.flip();

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

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

get()读取

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

复制代码
1
2
charBuffer.get();//循环调用5次,读取"Hello"

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

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

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

复制代码
1
2
charBuffer.mark()

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

最后

以上就是糟糕钥匙最近收集整理的关于Java IO详解:从IO了解数据缓存的基本思想(二)Buffer(以ByteBuffer为例)的全部内容,更多相关Java内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部