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()); }
1
2
3
4
5
6
7
8
9
輸出結果
abc--10 3 0 abc --10 10 0
1
2
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"); }
1
2
3
4
5
6
7
8
9
輸出:
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)
1
2
3
4
5
6
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()); }
1
2
3
4
5
6
7
8
9
10
11
輸出
abc 0 3 10 bc 0 2 2
1
2
3
4
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。