Java网络编程从入门到精通(34) - 编程入门网
态
当缓冲区的当前位置如图3所示时,使用put和get方法将会抛出上述的BufferOverflowException异常。 图3 当前位置处于缓冲区尾 如果要使用get方法得到缓冲区中的指定数据,必须将缓冲区的当前位置移动到指定的位置,我们可以使用position方法将当前位置移到缓冲区的任何位置。如下面的代码将图3所示的缓冲区的当前位置设为2,并用get方法获得位置2的数据:
上面的代码将输出3。缓冲区的当前位置为除了使用position方法,也可以使用rewind方法将缓冲区的当前位置设为0,rewind方法的定义如下: public final Buffer rewind() 在图2所示的缓冲区状态下调用rewind方法,就会得到如图4的缓冲区状态。 图4 调用rewind方法后的缓冲区状态 Java网络编程从入门到精通(34)(3)时间:2011-01-13 BlogJava 银河使者接下来让我们执行如下语句: System.out.println(byteBuffer.get()); 缓冲区的状态将如图5所示。 图5 调用get方法后的缓冲区状态 缓冲区除了position和capacity外,还提供了一个标识来限制缓冲区可访问的范围。这个标识就是limit。limit和position一样,在缓冲区类中也提供了两个重载方法。用于获得和设置limit的值。limit方法的定义如下:
在初始状态下,缓冲区的limit和capacity值相同。但limit和capacity的区别是limit可以通过limit方法进行设置,而capacity在创建缓冲区时就已经指定了,并且不能改变。(在上面所讲的position方法的newPosition参数的取值范围时曾说是0 <= newPosition < capacity,其实严格地说,应是0 <= newPosition < limit)limit的其他性质和capacity一样。如在图5所示的缓冲区状态中将limit的值设为2,就变成了图6所示的状态。 图6 将limit设为2的缓冲区状态 在这时position的值等于limit,就不能访问缓冲区的当前数据,也就是说不能使用get和put方法。否则将抛出BufferOverflowException异常。由于使用allocate创建的缓冲区并不是一次性地分配内存空间,因此,可以将缓冲区的capacity设为很大的值,如10M。缓冲区过大可能在某些环境中会使系统性能降低(如在PDA或智能插秧机中),因此,可以使用limit方法根据具体的情况来限定缓冲区的大小。当然,limit还可以表示缓冲区中实际的数据量,这将在后面讲解。下面的代码演示了如何使用limit方法来枚举缓冲区中的数据:
我们还可以用flip和hasRemaining方法来重写上面的代码。flip方法将limit设为缓冲区的当前位置。当limit等于position时,hasRemaining方法返回false,而则返回true。 flip和hasRemaining方法的定义如下:
下面的代码演示了如何使用hasRemaining方法来枚举缓冲区中的数据:
如果从缓冲区的第一个位置依次使用put方法向缓冲区写数据,当写完数据后,再使用flip方法。这样limit的值就等于缓冲区中实际的数据量了。在网络中传递数据时,可以使用这种方法来设置数据的结束位置。 Java网络编程从入门到精通(34)(4)时间:2011-01-13 BlogJava 银河使者为了回顾上面所讲内容,下面的代码总结了创建缓冲区、读写缓冲区中的数据、设置缓冲区的limit和position的方法。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |