读书人

NIO中缓冲区的API引见

发布时间: 2012-08-21 13:00:21 作者: rapoo

NIO中缓冲区的API介绍

[转载请注明作者和出处, ?如有谬误, 欢迎在评论中指正. ]

在java NIO中, 通道是IO传输发生时数据通过的入口, 而缓冲区是数据的来源或目标.?

Buffer是java NIO中定义的所有缓冲区类的基类.

?

Buffer的属性

1. 容量(capacity)

缓冲区能够容纳的数据元素的最大数量, capacity在创建缓冲区时指定, 之后无法改变.

2. 上界(limit)

读模式下, limit表示能读取的最后一个字节; 写模式下, limit等于capacity.

3. 位置(position)

position表示当前索引.

4. 标记(mark)

mark表示一个备忘position.

属性之间的关系:0 <= mark <= position <= limit <= capacity

?

Buffer中与属性相关的API

1. int capacity(). 该方法返回Buffer的容量.

2. clear(). 该方法并不改变Buffer中已有的任何数据, 只是将position设置为0, limit设置为capacity. 一般在向缓冲区写入数据之前调用.

3. flip(). 将Buffer从写模式反转成读模式. 该方法将limit设置为当前position, 然后将position设置为0. 一般在读取缓冲区数据之前调用.

4. boolean hasRemaining(). 当前position和limit之间是否有元素.

5. int limit(). 返回Buffer的limit.

6. limit(int newLimit). 设置Buffer的limit.

7. mark(). 标记当前position.?

8. int position(). 返回当前的position.

9. position(int newPosition). 设置position.

10. int remaining(). 返回position和limit之间的元素个数.

11. reset(). 将position设置为之前mark的位置. 如果mark无效, 将抛出InvalidMarkException异常.

12. rewind(). 将position设置为0, 并抛弃mark. 不改变limit的值. 一般用于重新读取缓冲区中的数据.

?

填充和释放缓冲区

由于Buffer的各个子类的填充和释放缓冲区的方法所需的参数不一致, 所以没有将这些方法抽象到Buffer类中. 以ByteBuffer为例, 其填充和释放缓冲区方法有:

1. byte get(). 相对get操作, 该方法返回当前position处的byte数据, 并将position加1. 如果当前position大于等于limit, get()方法将抛出BufferUnderflowException异常.

2. byte get(int index). 绝对get操作, 该方法返回index处的byte数据, 不position的值. 如果指定的index小于0, 或者大于等于limit, 将方法将抛出IndexOutOfBoundsException异常.

3. get(byte[] dst, int offset, int length). 相对批量get操作, 与多次get操作比较, 该方法具有更高的效率. 如果length大于缓冲区的剩余字节, 将抛出BufferUnderflowException异常. 如果缓冲区存有比数组能容纳的数量更多的数据, 可以使用如下的方式处理:

2. CharBuffer asReadOnlyBuffer(). 创建只读缓冲区视图. 只读缓冲区视图不允许使用put操作, 并且其isReadOnly()函数将会返回true. 其余和duplicate()方法返回的缓冲区视图完全相同.

3. CharBuffer slice(). slice方法返回的缓冲区视图和duplicate()方法返回的缓冲区视图区别在于, slice视图只和原始缓冲区共享部分数据元素, slice视图的初始属性值分别为: position是0, limit和capacity为原始缓冲区的limit-position. 其余部分和duplicate视图完全相同.

除了以上3个API, ByteBuffer类提供了其特有的创建视图缓冲区的API:

public abstract CharBuffer asCharBuffer();   public abstract ShortBuffer asShortBuffer();  public abstract IntBuffer asIntBuffer();  public abstract LongBuffer asLongBuffer();   public abstract FloatBuffer  asFloatBuffer();  public abstract DoubleBuffer asDoubleBuffer();

由于char, short, int, long, float, double都是多字节数据, 因此ByteBuffer的字节顺序决定了多个字节以怎样的形式组织成一个数据.

?

读书人网 >编程

热点推荐