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之间的字节数 |