NIO之緩衝區【複製緩衝區】

複製緩衝區
  複製一個緩衝區會創建一個新的 Buffer 對象,但並不複製數據。原始緩衝區和副本都會操作同樣的數據元素。我們將以 CharBuffer 爲例來演示,但同樣的操作可被用於任何基本的緩衝區類型。

public abstract class CharBuffer extends Buffer implements CharSequence, Comparable 

 // This is a partial API listing 
 public abstract CharBuffer duplicate( ); 
 public abstract CharBuffer asReadOnlyBuffer( ); 
 public abstract CharBuffer slice( ); 
}
1
2
3
4
5
6
7
duplicate
  函數創建了一個與原始緩衝區相似的新緩衝區。兩個緩衝區共享數據元素,擁有同樣的容量,但每個緩衝區擁有各自的位置,上界和標記屬性。對一個緩衝區內的數據元素所做的改變會反映在另外一個緩衝區上。這一副本緩衝區具有與原始緩衝區同樣的數據視圖。如果原始的緩衝區爲只讀,或者爲直接緩衝區,新的緩衝區將繼承這些屬性。

public static void main(String[] args) {
    CharBuffer charbuffer1 = CharBuffer.allocate(10);
    CharBuffer charbuffer2 = charbuffer1.duplicate();
    charbuffer1.put('a').put('b').put('c');
    charbuffer1.flip();
    System.out.println(charbuffer1+"--"+charbuffer1.capacity()+" "+charbuffer1.limit()+" "+charbuffer1.position());
    System.out.println(charbuffer2+"--"+charbuffer2.capacity()+" "+charbuffer2.limit()+" "+charbuffer2.position());

}

輸出結果

abc--10 3 0
abc   --10 10 0
 


asReadOnlyBuffer
  asReadOnlyBuffer()函數來生成一個只讀的緩衝區視圖,這與duplicate()相同,除了這個新的緩衝區不允許使用put(),並且其isReadOnly()函數將會返回true。對這一隻讀緩衝區的put()函數的調用嘗試會導致拋出ReadOnlyBufferException異常。

public static void main(String[] args) {
       CharBuffer charbuffer1 = CharBuffer.allocate(10);
       CharBuffer charbuffer2 = charbuffer1.asReadOnlyBuffer();
       charbuffer1.put('a').put('b').put('c');
       charbuffer1.flip();
       System.out.println(charbuffer1);
       System.out.println(charbuffer2);
       charbuffer2.put("d");
}

輸出:

abc
abc
Exception in thread "main" java.nio.ReadOnlyBufferException
    at java.nio.CharBuffer.put(Unknown Source)
    at java.nio.CharBuffer.put(Unknown Source)
    at com.sxt.nio.Demo02.main(Demo02.java:14)

slice
  分割緩衝區與複製相似,但slice()創建一個從原始緩衝區的當前位置開始的新緩衝區,並且其容量是原始緩衝區的剩餘元素數量(limit-position)。這個新緩衝區與原始緩衝區共享一段數據元素子序列。分割出來的緩衝區也會繼承只讀和直接屬性。

public static void main(String[] args) {
       CharBuffer charbuffer1 = CharBuffer.allocate(10);
       charbuffer1.put('a').put('b').put('c');
       charbuffer1.flip();
       System.out.println(charbuffer1);
       System.out.println(charbuffer1.position()+" "+charbuffer1.limit()+" "+charbuffer1.capacity());
       charbuffer1.position(1);
       CharBuffer cb = charbuffer1.slice();
       System.out.println(cb);
       System.out.println(cb.position()+" "+cb.limit()+" "+cb.capacity());
}

輸出

abc
0 3 10
bc
0 2 2
 

--------------------- 
作者:波波烤鴨 
來源:CSDN 
原文:https://dpb-bobokaoya-sm.blog.csdn.net/article/details/89197041 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章