JAVA中的Buffer
来源:互联网 发布:诚知此恨人人有 编辑:程序博客网 时间:2024/05/13 03:40
JAVA中的Buffer
一、属性
Buffer有四个基本属性:
1、capacity 容量,buffer能够容纳的最大元素数目,在Buffer创建时设定并不能更改
2、limit buffer中有效位置数目,不能对超过limit中的区域进行读写。
3、position 下一个读或者写的位置
4、mark 用于记忆的标志位,配合reset()使用,初始值未设定,调用mark后将当前position设为值
四者关系:0 <= mark <= position <= limit <= capacity
- capacity:Buffer的内存固定的一个大小值,一般创建Buffer时初始化写入-->ByteBuffer.allocate(capacity),需注意写入数据时需考虑数据大小是否超过Buffer的大小,如果超过需对Buffer进行扩容。
- position和limit都分读和写2种情况:
- position在读和写情况的分析:
1)写数据到Buffer中时,position表示写入数据的当前位置。position的初始值为0.当一个byte、long等数据写到Buffer后, position会向下移动到下一个可插入数据的Buffer单元。position最大可为capacity – 1(因为position的初始值为0).
2)读数据到Buffer中时,position表示读入数据的当前位置,如position=2时表示已开始读入了3个byte,或从第3个byte开始读取。通过ByteBuffer.flip()切换到读模式时position会被重置为0,当Buffer从position读入数据后,position会下移到下一个可读入的数据Buffer单元。 - limit在读和写情况的分析:
1)写数据时,limit表示可对Buffer最多写入多少个数据。
2)读数据时,limit表示Buffer里有多少可读数据(not null的数据),因此能读到之前写入的所有数据(limit被设置成已写数据的数量,这个值在写模式下就是position)
flip相当于写模式改成读模式,limit = position位置,position = 0
Limit(int)
如果position>limit, position = limit,如果mark>limit, 重置mark
Mark()
取当前的position的快照标记mark
Reset()
恢复position到先前标记的mark
Clear()
limit=capacity , position=0,重置mark,但是不清空数据,为了从头开始put做准备,其实就是清空数据,因为你put就覆盖了原来的数据
Rewind()
position=0,重置mark,一系列写操作后,为了从头开始get做准备,和clear()有用途上的区别,他大部分是用来从头开始读取,而clear是大部分用来重头开始填充,就是清理的意思
Flip()
limit=position , position=0,重置mask,为了将buf写出做好准备,一般是结束buf操作,将buf写入输出流时调用,这个必须要调用,否则极有可能position!=limit,导致position后面没有数据,每次写入数据到输出流时,必须确保position=limit。
Remaining()
返回limit-position,返回缓冲器中的剩余字节
Wrap(byte[])
组装到新的buffer,capacity=limit=byte[].length,position=0 重置mark
Slice()
分割缓冲器,将remaining的空间形成一个新的buffer,新的position=0,limit=capacity=remaining,重置mark,和主缓冲区内容共享,其它都独立
Duplicate()
复制缓冲区,内容共享,其它都独立
asReadOnlyBuffer()
和duplicate一样,只是不可写
Compact()
将position和limit之间的字节移到最前面,position=limit-position,这就是这里的压缩的意思,一般是结束buf操作,将buf写入输出流时调用
Position(int)
position=newPosition,如果position<mark,重置mark
Remaining()
返回position和limit之间的字节数
- JAVA中的Buffer
- java中的Buffer抽象类
- Java NIO中的Buffer 详解
- java中的String Buffer类
- Protocol Buffer在Java中的应用
- java.nio.Buffer 中的 flip()方法
- Java NIO 中的Buffer和Channel了解
- java - Buffer
- 《Java源码解析》NIO中的heap Buffer和direct Buffer区别
- 【Protobuf】Protocol buffer在Java语言中的应用01
- Java NIO中的缓冲区Buffer(二)创建-复制缓冲区
- Java NIO中的缓冲区Buffer(二)创建-复制缓冲区
- Java NIO中的缓冲区Buffer(二)创建-复制缓冲区
- Java NIO中的缓冲区Buffer(二)创建-复制缓冲区
- flex中的buffer
- session中的buffer巧用
- oracle中的buffer cache
- Buffer中的flip()
- 第十一周项目1——二叉树算法验证(4) 哈夫曼编码的算法验证
- Android eclipse SDK更新
- The Zen of Python——this.py文件的解析
- 带表头结点的链表进行栈操作
- python 网络爬虫入门(一)———第一个python爬虫实例
- JAVA中的Buffer
- 隐式游标
- Action 和 Func 泛型封装委托
- char* a和char a[]的区别
- AndroidJNI 函数介绍(全)
- 数据结构实验之图论四:迷宫探索
- leetcode:453. Minimum Moves to Equal Array Elements
- 原生JS去除并计算重复数组的个数
- 第十一周项目2——用二叉树求解代数表达式