关于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()的话,我们会看到除了打印出数组中我们设置的内容之外,还会在后面打印出一系列自动设置的零值。