NIO buffer中clear、compact方法的區別
阿新 • • 發佈:2018-11-10
呼叫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 } }