快速业务通道

Java网络编程从入门到精通(34) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21

当缓冲区的当前位置如图3所示时,使用put和get方法将会抛出上述的BufferOverflowException异常。

图3  当前位置处于缓冲区尾

如果要使用get方法得到缓冲区中的指定数据,必须将缓冲区的当前位置移动到指定的位置,我们可以使用position方法将当前位置移到缓冲区的任何位置。如下面的代码将图3所示的缓冲区的当前位置设为2,并用get方法获得位置2的数据:

byteBuffer.position(2); System.out.println(byteBuffer.get());

上面的代码将输出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方法的定义如下:

public final int limit() public final Buffer limit(int newLimit)

在初始状态下,缓冲区的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方法来枚举缓冲区中的数据:

while(byteBuffer.position() < byteBuffer.limit())     System.out.println(byteBuffer.get());

我们还可以用flip和hasRemaining方法来重写上面的代码。flip方法将limit设为缓冲区的当前位置。当limit等于position时,hasRemaining方法返回false,而则返回true。 flip和hasRemaining方法的定义如下:

public final Buffer flip() public final boolean hasRemaining() 

下面的代码演示了如何使用hasRemaining方法来枚举缓冲区中的数据:

while(byteBuffer.hasRemaining())     System.out.println(byteBuffer.get());

如果从缓冲区的第一个位置依次使用put方法向缓冲区写数据,当写完数据后,再使用flip方法。这样limit的值就等于缓冲区中实际的数据量了。在网络中传递数据时,可以使用这种方法来设置数据的结束位置。

Java网络编程从入门到精通(34)(4)

时间:2011-01-13 BlogJava 银河使者

为了回顾上面所讲内容,下面的代码总结了创建缓冲区、读写缓冲区中的数据、设置缓冲区的limit和position的方法。

package net;    import java.nio.*;    public class GetPutData    {      

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号