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 - 如果不存在某个可访问的数组实现此缓冲区