关于ByteBuffer中flip和rewind方法的作用说明

本文通过示例对比了Java NIO中flip与rewind方法的不同效果。flip会将limit设置为当前位置并反转缓冲区,而rewind则使position回到初始位置,保留原有limit。文中还展示了两种情况下对缓冲区进行读取操作的具体行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        关于flip,看到JDK的文档大概是这么说的:“将limit属性设置为当前的位置”;而关于rewind方法,是在limit属性已经被设置合适的情况下使用的。也就是说这两个方法虽然都能够使指针返回到缓冲区的第一个位置,但是flip在调整指针之前,将limit属性设置为当前位置。

        以下程序可以验证:

package com.bijian.study;

import java.nio.*;

public class IntBufferDemo {

    /**
    * @param args
    */
    private static final int BSIZE = 1024;

    public static void main(String[] args) {

        ByteBuffer bb = ByteBuffer.allocate(BSIZE);
        IntBuffer ib = bb.asIntBuffer(); // view buffer

        // 存储int的数组
        ib.put(new int[] { 11, 42, 47, 99, 143, 811, 1016 });

        // 绝对位置读写
        //System.out.println(ib.get(3));

        System.out.println("*******************************");
        System.out.println(ib.limit());
        ib.put(3, 1811);
        ib.flip();
        //ib.rewind();
        System.out.println(ib.limit());
        System.out.println("*******************************");
        
        while (ib.hasRemaining()) {
            int i = ib.get();
            System.out.println(i);
        }
    }
}

运行结果:

*******************************
256
7
*******************************
11
42
47
1811
143
811
1016

        将flip()替换成rewind()如下:

package com.bijian.study;

import java.nio.*;

public class IntBufferDemo {

    /**
    * @param args
    */
    private static final int BSIZE = 1024;

    public static void main(String[] args) {

        ByteBuffer bb = ByteBuffer.allocate(BSIZE);
        IntBuffer ib = bb.asIntBuffer(); // view buffer

        // 存储int的数组
        ib.put(new int[] { 11, 42, 47, 99, 143, 811, 1016 });

        // 绝对位置读写
        //System.out.println(ib.get(3));

        System.out.println("*******************************");
        System.out.println(ib.limit());
        ib.put(3, 1811);
        //ib.flip();
        ib.rewind();
        System.out.println(ib.limit());
        System.out.println("*******************************");
        
        while (ib.hasRemaining()) {
            int i = ib.get();
            System.out.println(i);
        }
    }
}

运行结果:

*******************************
256
256
*******************************
11
42
47
1811
143
811
1016
0
0
0
0
0
...

        我们看到除了打印出数组中我们设置的内容之外,还会在后面打印出一系列自动设置的零值。

 

文章来源:http://blog.youkuaiyun.com/cnweike/article/details/6942024

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值