Nio flip()方法,position limit capacity

博客总结了数据读取中capacity、position和limit的特性。capacity指定后大小不变;position随读取数据长度变化,flip()后会重置;limit初始化与capacity相同,flip()后限制读取长度。若要第二次完整读取数据,需用clear重置属性。
代码:
 FileInputStream fileInputStream = new FileInputStream("test1.txt");
        FileChannel channel = fileInputStream.getChannel();
        ByteBuffer byteBuffer = ByteBuffer.allocate(20);
        System.out.println("--------初始化完成--------------");
        System.out.println("capacity:" + byteBuffer.capacity());
        System.out.println("limit:" + byteBuffer.limit());
        System.out.println("position:" + byteBuffer.position());

        channel.read(byteBuffer);
        System.out.println("--------第一次读取数据完成后值--------------");
        System.out.println("capacity:" + byteBuffer.capacity());
        System.out.println("limit:" + byteBuffer.limit());
        System.out.println("position:" + byteBuffer.position());

        byteBuffer.flip();
        System.out.println("--------第一次读取数据后,第一次flip()后值--------------");
        System.out.println("capacity:" + byteBuffer.capacity());
        System.out.println("limit:" + byteBuffer.limit());
        System.out.println("position:" + byteBuffer.position());

        while (byteBuffer.remaining() > 0){
            System.out.println(byteBuffer.get());
        }
        byteBuffer.flip();
        System.out.println("--------第一次读取数据后,第二次flip()后值--------------");

        System.out.println("capacity:" + byteBuffer.capacity());
        System.out.println("limit:" + byteBuffer.limit());
        System.out.println("position:" + byteBuffer.position());

        FileInputStream fileInputStream1 = new FileInputStream("test2.txt");
        FileChannel channel1 = fileInputStream1.getChannel();
        channel1.read(byteBuffer);
        System.out.println("--------第二次读取数据后值--------------");
        System.out.println("capacity:" + byteBuffer.capacity());
        System.out.println("limit:" + byteBuffer.limit());
        System.out.println("position:" + byteBuffer.position());

        byteBuffer.flip();
        System.out.println("--------第二次读取数据后,第一次flip()后值--------------");
        System.out.println("capacity:" + byteBuffer.capacity());
        System.out.println("limit:" + byteBuffer.limit());
        System.out.println("position:" + byteBuffer.position());
        while (byteBuffer.remaining() > 0){
            System.out.println(byteBuffer.get());
        }
        byteBuffer.flip();
        System.out.println("--------第二次读取数据后,flip()后值--------------");
        System.out.println("capacity:" + byteBuffer.capacity());
        System.out.println("limit:" + byteBuffer.limit());
        System.out.println("position:" + byteBuffer.position());

        byteBuffer.clear();
        System.out.println("--------clear()后值--------------");
        System.out.println("capacity:" + byteBuffer.capacity());
        System.out.println("limit:" + byteBuffer.limit());
        System.out.println("position:" + byteBuffer.position());
输出:
--------初始化完成--------------
capacity:20
limit:20
position:0
--------第一次读取数据完成后值--------------
capacity:20
limit:20
position:8
--------第一次读取数据后,第一次flip()后值--------------
capacity:20
limit:8
position:0
97
98
99
100
101
102
103
104
--------第一次读取数据后,第二次flip()后值--------------
capacity:20
limit:8
position:0
--------第二次读取数据后值--------------
capacity:20
limit:8
position:8
--------第二次读取数据后,第一次flip()后值--------------
capacity:20
limit:8
position:0
122
121
120
104
103
102
101
100
--------第二次读取数据后,flip()后值--------------
capacity:20
limit:8
position:0
--------clear()后值--------------
capacity:20
limit:20
position:0

 

 public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }

总结:

    capacity:指定后大小不会变化

   position: 根据读取的数据长度变化,第一次读取后,长度为数据长度(8),flip()后,长度变为0 ,从0开始写出数据,第二次读取数据,则不能完成读取,只能读取与第一次数据长度相同的数据(8,实际第二次的数据长度为11)

     limit:初始化长度与capacity相同,第一次读取数据,flip() 执行limit = position, 写出数据后,第二次读取数据,limit限制了读取数据的长度

如果需要第二次完整读取数据,需要clear将所有属性重置

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值