快速业务通道

Java网络编程从入门到精通(33):非阻塞I/O的缓冲区(Buffer) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
 length) IntBuffer类中的wrap方法: public static IntBuffer wrap(byte[] array) public static IntBuffer wrap(byte[] array, int offset, int length)

其他五个缓冲区类中的wrap 方法定义和上面的定义类似,只是返回值的类型是相应的缓冲区类。

在wrap方法中的array参数是要转换的数组(如果是其他的缓冲区类,数组的类型就是相应的简单类型,如IntBuffer类中的wrap方法的array就是int[]类型)。offset是要转换的子数组的偏移量,也就是子数组在array中的开始索引。length是要转换的子数组的长度。利用后两个参数可以将array数组中的一部分转换成缓冲区对象。它们的使用方法如下:

byte[] myByte = new byte[] { 1, 2, 3 }; int[] myInt = new int[] { 1, 2, 3, 4 }; ByteBuffer byteBuffer = ByteBuffer.wrap(myByte); IntBuffer intBuffer = IntBuffer.wrap(myInt, 1, 2);

可以通过缓冲区类的capacity方法来得到缓冲区的大小。capacity方法的定义如下:

public final int capacity()

如果使用allocate方法来创建缓冲区,capacity方法的返回值就是capacity参数的值。而使用wrap方法来创建缓冲区,capacity方法的返回值是array数组的长度,但要注意,使用wrap来转换array的字数组时,capacity的长度仍然是原数组的长度,如上面代码中的intBuffer缓冲区的capacity值是4,而不是2。

除了可以将数组转换成缓冲区外,也可以通过缓冲区类的array方法将缓冲区转换成相应类型的数组。IntBuffer类的array方法的定义方法如下(其他缓冲区类的array的定义类似):

public final int[] array()

下面的代码演示了如何使用array方法将缓冲区转换成相应类型的数组。

int[] myInt = new int[] { 1, 2, 3, 4, 5, 6 }; IntBuffer intBuffer = IntBuffer.wrap(myInt, 1, 3); for (int v : intBuffer.array())      System.out.print(v + " ");

在执行上面代码后,我们发现输出的结果是1 2 3 4 5 6,而不是2 3 4。这说明在将子数组转换成缓冲区的过程中实际上是将整个数组转换成了缓冲区,这就是用wrap包装子数组后,capacity的值仍然是原数组长度的真正原因。在使用array方法时应注意,在以下两种缓冲区中不能使用array方法:

只读的缓冲区

如果使用只读缓冲区的array方法,将会抛出一个ReadOnlyBufferException异常。

使用allocateDirect方法创建的缓冲区。

如果调用这种缓冲区中的array方法,将会抛出一个UnsupportedOperationException异常。

可以通过缓冲区类的hasArray方法来判断这个缓冲区是否可以使用array方法,如果返回true,则说明这个缓冲区可以使用array方法,否则,使用array方法将会抛出上述的两种异常之一。

注意: 使用array方法返回的数组并不是缓冲区数据的副本。被返回的数组实际上就是缓冲区中的数据,也就是说,array方法只返回了缓冲区数据的引用。当数组中的数据被修改后,缓冲区中的数据也会被修改,返之也是如此。关于这方面内容将在下一节“读写缓冲区中的数据”中详细讲解。

Java网络编程从入门到精通(33):非阻塞I/O的缓冲区(Buffer)(3)

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

在上述的七个缓冲区类中,ByteBuffer类和CharBuffer类各自还有另外一种方法来创建缓冲区对象。

l ByteBuffer类

可以通过ByteBuffer类的allocateDirect方法来创建ByteBuffer对象。allocateDirect方法的定义如下:

public static ByteBuffer allocateDirect(int capacity)

使用allocateDirect方法可以一次性分配capacity大小的连续字节空间。通过allocateDirect方法来创建具有连续空间的ByteBuffer对象虽然可以在一

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号