複製緩衝區
複製一個緩衝區會創建一個新的 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
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!