java NIO(五) 缓冲区——创建缓冲区


NIO有两种方式创建缓冲区:分配、包装

我们以CharBuffer为例进行说明:

一、分配方式:allocate

下面是java6对CharBuffer的allocate的定义:

public static CharBuffer allocate(int capacity)分配新的字符缓冲区。 
新缓冲区的位置将为零,其界限将为其容量,其标记是未定义的。它将具有一个底层实现数组,且其数组偏移量将为零。 
参数:
capacity - 新缓冲区的容量,以字符为单位 
返回:
新的字符缓冲区 
抛出: 
IllegalArgumentException - 如果 capacity 为负整数

例:

CharBuffer charBuffer=CharBuffer.allocate(100);分配一个容量为100个char变量的CharBuffer

二、包装方式:wrap

包装操作创建一个缓冲区对象但是不分配任何空间存储数据元素。它使用您所提供的数组作为存储空间来存储缓冲区中的数据元素

下面是java6对CharBuffer的wrap的定义:

public static CharBuffer wrap(char[] array)将字符数组包装到缓冲区中。 
给定的字符数组将支持新缓冲区;即缓冲区修改将导致数组修改,反之亦然。
新缓冲区的容量和界限将为 array.length,其位置将为零,其标记是未定义的。其底层实现数组将为给定数组,并且其数组偏移量将为零。
参数:
array - 实现此缓冲区的数组 
返回:
新的字符缓冲区
public static CharBuffer wrap(char[] array,
                              int offset,
                              int length)将字符数组包装到缓冲区中。 
给定的字符数组将支持新缓冲区;即缓冲区修改将导致数组修改,反之亦然。
新缓冲区的容量将为 array.length,其位置将为 offset,其界限将为 offset + length,其标记是未定义的。其底层实现数组将为给定数组,并且其数组偏移量将为零。 

参数:
array - 支持新缓冲区的数组
offset - 要使用的子数组的偏移量;必须为非负且不大于 array.length。将新缓冲区的位置设置为此值。
length - 要使用的子数组的长度;必须为非负且不大于 array.length - offset。新缓冲区的界限将被设置为 offset + length。 
返回:
新的字符缓冲区 
抛出: 
IndexOutOfBoundsException - 如果关于 offset 和 length 参数的前提不成立

其余两个wrap方法我们在这里先不介绍,在今后的章节会进行介绍

例:

Char[] myArray=new Char[100];

CharBuffer charBuffer=CharBuffer.wrap(myArray);

以上对象构造了一个新的缓冲区对象,但是数据元素会存储在数组中。

CharBuffer charBuffer=CharBuffer.wrap(myArray,12,42);

创建了一个position=12,limit=54,容量为myArray.length的缓冲区对象


通过allocate和wrap创建的缓冲区通常是间接的。间接的缓冲区使用备份数组

hasArray()会告诉我们缓冲区是否有一个可存取的备份数组,如果返回为true,array()函数会返回这个缓冲区使用的数组存储空间的引用。

如果返回false,调用array或者arrayOffset会产生UnsuppootedOperationException异常。

如果一个缓冲区是只读的,调用arra或者arrayOffset会返回ReadOnlyException异常来阻止获得存取权限来修改缓冲区中的内容。

下面是java6帮助文档中的hasArray方法的说明:

public final boolean hasArray()判断该缓冲区是否可通过一个可访问的字符数组实现。 
如果此方法返回 true,则可以安全地调用 array 和 arrayOffset 方法。 
指定者:
类 Buffer 中的 hasArray
返回:
当且仅当存在实现此缓冲区的数组,并且此缓冲区不是只读缓冲区时,返回 true

public final char[] array()返回实现此缓冲区的字符数组(可选操作)。 
此缓冲区的内容修改将导致返回的数组内容修改,反之亦然。 

调用此方法之前要调用 hasArray 方法,以确保此缓冲区具有可访问的底层实现数组。 


指定者:
类 Buffer 中的 array
返回:
实现此缓冲区的数组 
抛出: 
ReadOnlyBufferException - 如果存在实现此缓冲区的数组,但缓冲区是只读的 
UnsupportedOperationException - 如果不存在某个可访问的数组实现此缓冲区
public final int arrayOffset()返回此缓冲区中的第一个元素在缓冲区的底层实现数组中的偏移量(可选操作)。 
如果存在实现此缓冲区的数组,则缓冲区位置 p 对应于数组索引 p + arrayOffset()。 

调用此方法之前要调用 hasArray 方法,以确保此缓冲区具有可访问的底层实现数组。 


指定者:
类 Buffer 中的 arrayOffset
返回:
此缓冲区的第一个元素在缓冲区数组中的偏移量 
抛出: 
ReadOnlyBufferException - 如果存在实现此缓冲区的数组,但缓冲区是只读的 
UnsupportedOperationException - 如果不存在某个可访问的数组实现此缓冲区



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值