调用clear()方法:position将被设回0,limit设置成capacity,换句话说,Buffer被清空了,其实Buffer中的数据并未被清除,只是这些标记告诉我们可以从哪里开始往Buffer里写数据。如果Buffer中有一些未读的数据,调用clear()方法,数据将“被遗忘”,意味着不再有任何标记会告诉你哪些数据被读过,哪些还没有。如果Buffer中仍有未读的数据,且后续还需要这些数据,但是此时想要先写些数据,那么使用compact()方法。compact()方法将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据。
package NIO;
import java.nio.CharBuffer;
/**
* @ClassName BufferTest
* @Description TODO
* @Author Kikityer
* @Date 2018/10/18 11:25
* @Version 1.0.0
**/
public class BufferTest {
public static void main(String[] args) {
CharBuffer charBuffer = CharBuffer.allocate(8);
System.out.println(charBuffer.capacity()); //8
System.out.println(charBuffer.limit()); //8
System.out.println(charBuffer.position()); //0
charBuffer.put('a');
charBuffer.put('b');
charBuffer.put('c');
System.out.println(charBuffer.position()); //3
charBuffer.flip();//写模式转到读模式
System.out.println(charBuffer.limit()); //3
System.out.println(charBuffer.position()); //0
System.out.println("取出第一个元素是:"+charBuffer.get()); //a
System.out.println("取完第一个元素之后,position的变化:"+charBuffer.position()); //1
charBuffer.clear();//取完第一个元素之后,执行clear方法,重新为写操作做准备
System.out.println(charBuffer.position()); //0
System.out.println(charBuffer.get()); //a 事实证明clear之后。之前的元素还在,并未被清空。当有新的元素进来时才会将其覆盖。
System.out.println(charBuffer.get(1)); //b
System.out.println(charBuffer.get(2)); //c
System.out.println(charBuffer.limit()); //8
System.out.println("---------------------");
charBuffer.clear();
charBuffer.put('d');
charBuffer.put('e');
charBuffer.put('f');
charBuffer.flip();
System.out.println(charBuffer.position()); //0
System.out.println(charBuffer.limit()); //3
System.out.println(charBuffer.get()); //d
System.out.println(charBuffer.get(1)); //e
System.out.println(charBuffer.get(2)); //f
}
}