buffer缓冲区

当用到二进制传输的时候,一定会用bytebuffer这个类,它是buffer接口的子类。
ByteBuffer byteBuffer = ByteBuffer.allocate(6);
虽然使用allocate方法创建的缓冲区并不是一次性地分配内存空间,但我们可以从用户地角度将一个缓冲区想象成一个长度为capacity的数组。 当缓冲区创建后,和数组一样,缓冲区的大小(capacity值)将无法改变,也无法访问缓冲区外的数据

既然缓冲区和数组类似,那么缓冲区也应该象数组一样可以标识当前的位置。缓冲区的position方法为我们提供了这个功能。position方法有两种重载形式,它们的定义如下:
   
    public final int position()
   
    public final Buffer position(int newPosition)
   
    第一个重载形式用来获取缓冲区的当前位置。在创建缓冲区后,position的初始值是0,也就是缓冲区第一个元素的位置。当从缓冲区读取一个元素后,position的值加1.我们从这一点可以看出,position方法返回的位置就是当前可以读取的元素的位置。position的取值范围从0到capacity – 1. 如果position的值等于capacity,说明缓冲区当前已经没有数据可读了。

在大多数情况下不需要直接控制缓冲区的位置。缓冲区类提供的用于读写数据的方法可以自动地设置缓冲区的当前位置。在缓冲区类中,get和put方法用于读写缓冲区中的数据。 每当put方法向缓冲区写入一个数据后,缓冲区的当前位置都会加1. 如果缓冲区的当前位置已经等于capacity,调用put方法就会抛出一个java.nio.BufferOverflowException异常。在缓冲区未初赋值的区域将被0填充。使用get方法可以得到缓冲区当前位置的数据,并使缓冲区的当前位置加1.和put方法一样, [/color]在缓冲区当前位置等于capacity时使用get方法也会抛出java.nio.BufferOverflowException异常

可以使用position方法将当前位置移到缓冲区的任何位置。缓冲区除了position和capacity外,还提供了一个标识limit来限制缓冲区可访问的范围。[color=red]在初始状态下,缓冲区的limit和capacity值相同。但limit和capacity的区别是limit可以通过limit方法进行设置,而capacity在创建缓冲区时就已经指定了,并且不能改变。limit还可以表示缓冲区中实际的数据量

while(byteBuffer.hasRemaining())  // 枚举byteBuffer中的数据,常用判断
byteBuffer.flip();   // 将limit设为position即2,然后将position设置为 0

猜你喜欢

转载自love398146779.iteye.com/blog/1668097