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

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

package com.example.tests;

import java.nio.ByteBuffer;
import java.nio.IntBuffer;

public class TestBuffer {
    private static final int BSIZE = 1024; // 缓冲区大小

    public static void main(String[] args) {
        ByteBuffer bb = ByteBuffer.allocate(BSIZE);
        IntBuffer ib = bb.asIntBuffer();  // 构建整型缓冲区

        ib.put(new int[]{11, 42, 47, 99, 143, 811, 1016}); // 7 个数字
        System.out.println(ib.get(3)); // 输出 99

        ib.put(3, 1811);
        System.out.println(ib.get(3)); // 输出 1811

        ib.flip(); // 将缓冲区的limit属性设置为当前位置,并返回缓冲区的第一个位置;
        // ib.rewind(); // 返回缓冲区的第一个位置;
        System.out.println(ib.limit()); // 如果前面调用flip,则输出 7; 如果调用的是rewind,则输出256

        System.out.println("Output int buffer content: ");
        while (ib.hasRemaining()) {
            int i = ib.get();
            System.out.println(i);
        }
    }
}

如果将ib.flip() 换成ib.rewind()的话,我们会看到除了打印出数组中我们设置的内容之外,还会在后面打印出一系列自动设置的零值。

你可能感兴趣的:(Java)