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

  1. capacityBuffer的内存固定的一个大小值,一般创建Buffer时初始化写入-->ByteBuffer.allocate(capacity)需注意写入数据时需考虑数据大小是否超过Buffer的大小,如果超过需对Buffer进行扩容。

  2. positionlimit都分读和写2种情况:

  3. 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单元。

  4. 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[])

组装到新的buffercapacity=limit=byte[].lengthposition=0 重置mark

Slice()

分割缓冲器,将remaining的空间形成一个新的buffer,新的position=0limit=capacity=remaining,重置mark,和主缓冲区内容共享,其它都独立

Duplicate()

复制缓冲区,内容共享,其它都独立

asReadOnlyBuffer()

和duplicate一样,只是不可写

Compact()

positionlimit之间的字节移到最前面,position=limit-position,这就是这里的压缩的意思,一般是结束buf操作,将buf写入输出流时调用

Position(int)

position=newPosition,如果position<mark,重置mark

Remaining()

返回positionlimit之间的字节数



0 0