NIO buffer中clear、compact方法的区别

调用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

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40581455/article/details/83143634
今日推荐