购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3.2 限制获取与设置

方法int limit()的作用:返回此缓冲区的限制。

方法Buffer limit(int newLimit)的作用:设置此缓冲区的限制。

什么是限制呢?缓冲区中的限制代表第一个不应该读取或写入元素的index(索引)。缓冲区的限制(limit)不能为负,并且limit不能大于其capacity。如果position大于新的limit,则将position设置为新的limit。如果mark已定义且大于新的limit,则丢弃该mark。

position和mark这两个知识点在后面的章节有详细的介绍,此处只需要理解“限制(limit)代表第一个不应该读取或写入元素的index,缓冲区的limit不能为负,并且limit不能大于其capacity”即可。

limit的应用示例如图1-11所示。

图1-11 limit应用示例

虽然图1-11中的缓冲区一共有11个位置可以存放数据,但只允许前4个位置存放数据,后面的其他位置不可以存放数据。因此,JDK API DOC中对limit的解释是:代表第一个不应该读取或写入元素的index。下面再用代码进行验证,测试源代码如下:

public class Test2 {
public static void main(String[] args) {
    char[] charArray = new char[] { 'a', 'b', 'c', 'd', 'e' };
    CharBuffer buffer = CharBuffer.wrap(charArray);
    System.out.println("A capacity()=" + buffer.capacity() + " limit()=" +
    buffer.limit());
    buffer.limit(3);
    System.out.println();
    System.out.println("B capacity()=" + buffer.capacity() + " limit()=" +
    buffer.limit());
    buffer.put(0, 'o');// 0
    buffer.put(1, 'p');// 1
    buffer.put(2, 'q');// 2
    buffer.put(3, 'r');// 3--此位置是第一个不可读不可写的索引
    buffer.put(4, 's');// 4
    buffer.put(5, 't');// 5
    buffer.put(6, 'u');// 6
}
}

程序运行后,在第16行出现异常,如图1-12所示。

图1-12 出现异常

在A处打印的值是两个5,说明在调用wrap()方法后,limit的值是capacity+1,因为limit取值范围是从索引0开始,而capacity是从1开始。

Limit使用的场景就是当反复地向缓冲区中存取数据时使用,比如第1次向缓冲区中存储9个数据,分别是A、B、C、D、E、F、G、H、I,如图1-13所示。

图1-13 第1次存储9个数据

然后读取全部9个数据,完成后再进行第2次向缓冲区中存储数据,第2次只存储4个数据,分别是1、2、3、4,效果如图1-14所示。

图1-14 第2次存储4个数据

当读取时却出现了问题,如果读取全部数据1、2、3、4、E、F、G、H、I时是错误的,所以要结合limit来限制读取的范围,在E处设置limit,从而实现只能读取1、2、3、4这4个正确的数据。 IiyYmh0mXQE4hIybfrjqXd1acglyEqb3IZFqTKXCKPEVTPKNhhx+IPOAHIJiz0rd

点击中间区域
呼出菜单
上一章
目录
下一章
×