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

        关于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.csdn.net/cnweike/article/details/6942024

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ByteBuffer 是 Java 用于处理二进制数据的缓冲区类,它可以在缓冲区存储不同类型的数据,如 byte、short、int、long、float、double 等。使用 ByteBuffer 可以方便地进行数据的读取和写入,并且可以设置字节序(Byte Order)来保证数据在不同机器上的正确性。 ByteBuffer 的常用方法包括: 1. allocate(int capacity):分配一个容量为 capacity 的 ByteBuffer。 2. put(byte[] src):将一个字节数组写入到 ByteBuffer 。 3. get(byte[] dest):将 ByteBuffer 的数据读取到一个字节数组。 4. flip():将读写模式切换,将 limit 设置为当前位置,将 position 设置为 0。 5. rewind():将 position 设置为 0,使得数据可以重新读取。 6. clear():清空 ByteBuffer,将 position 设置为 0,将 limit 设置为 capacity。 例如,下面是一个使用 ByteBuffer 写入和读取数据的示例代码: ```java // 创建一个容量为 10 的 ByteBuffer ByteBuffer buffer = ByteBuffer.allocate(10); // 写入数据 buffer.putInt(123); buffer.putDouble(3.14); buffer.putChar('A'); // 切换到读模式 buffer.flip(); // 读取数据 int intValue = buffer.getInt(); double doubleValue = buffer.getDouble(); char charValue = buffer.getChar(); System.out.println(intValue); // 输出 123 System.out.println(doubleValue); // 输出 3.14 System.out.println(charValue); // 输出 A ``` 需要注意的是,ByteBuffer 的 position、limit 和 capacity 属性的含义如下: 1. position:当前读写位置。 2. limit:缓冲区的限制,即当前可以读写的最大位置。 3. capacity:缓冲区的容量,即最多可以存储多少字节数据。 在写入数据时,position 会自动向前移动,而 limit 和 capacity 不会变化;在读取数据时,position 和 limit 会随着读取的数据量自动向前移动。如果需要重新读取数据,可以使用 rewind() 方法将 position 设置为 0,如果需要清空缓冲区,可以使用 clear() 方法将 position 设置为 0,limit 设置为 capacity。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值