主要有如下兩種方式建立緩衝區:java
一、調用allocate方法數組
二、調用wrap方法緩存
咱們將以charBuffer爲例,闡述各個方法的含義;spa
調用allocate方法實際上會返回new HeapCharBuffer(capacity, capacity)對象;code
緩存空間存儲在CharBuffer類的成員屬性char[] hb數組裏,即JVM堆裏;對象
以下示例,建立了一個容量大小爲10的CharBuffer:blog
CharBuffer bf = CharBuffer.allocate(10);
allocate方法其實比較簡單,不過有點須要注意的是,allocate方法除了能夠分配JVM堆空間,還能夠分配直接內存空間(如ByteBuffer,能夠調用allocateDirect方法分配直接內存),其內部是經過調用unsafe.allocateMemory方法實現直接內存分配的,該空間不在JVM堆內部,後續會作更加詳細的說明;不過能夠稍微提醒一點,若是是直接內存空間的話,調用hasArray()方法會返回false;ip
調用wrap方法實際上會也會返回new HeapCharBuffer(array, offset, length)對象;內存
與allocate方法的區別是,它的緩存存儲空間是外部傳入的;ci
以下示例,建立了一個容量大小爲10的CharBuffer:
char[] myArray = new char[10]; CharBuffer charbuffer = CharBuffer.wrap(myArray);
另外,wrap還有一個重載方法:帶offset和length做爲參數的wrap()方法,以下是該方法的一個示例:
char[] myArray = new char[10]; CharBuffer charbuffer = CharBuffer.wrap (myArray, 2, 3);
以上代碼將會建立一個position = 2, limit = 5, capacity = 10的Buffer;
主要有如下三種方式複製緩衝區:
一、調用duplicate方法
二、調用asReadOnlyBuffer方法
三、調用slice方法
咱們將以charBuffer爲例,闡述各個方法的含義;
調用duplicate方法實際上會建立原緩存區的一個拷貝,不是深拷貝,是淺拷貝,什麼意思呢,就是這兩個緩存區會共享數據元素,但每一個緩存區的上界、容量、位置等屬性是各自獨立的;
修改其中一個緩存區的元素會影響另外一個拷貝緩存區,以下示例:
CharBuffer charbuffer1 = CharBuffer.allocate(10); CharBuffer charbuffer2 = charbuffer1.duplicate(); charbuffer1.put('a').put('b').put('c'); charbuffer1.flip(); System.out.println(charbuffer1); System.out.println(charbuffer2);
charbuffer2緩存區複製了charbuffer1緩存區,至始至終咱們只操做charbuffer1緩存區,最後打印的時候,卻發現charbuffer2緩存區裏已經有了charbuffer1緩存區的數據,結果打印以下:
調用asReadOnlyBuffer方法會生成一個只讀緩存區,與調用duplicate方法基本一致,惟一的區別是這個緩存區是隻讀的,若對其進行put操做的話,會拋出ReadOnlyBufferException;
以下示例:
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('c');//ReadOnlyBufferException
輸出結果:
slice方法實際上是用於分割緩存區的,該方法建立了一個從原始緩衝區的當前位置開始的新緩衝區,而且其容量是原始緩衝區的剩餘元素數量(limit-position);
該緩存區與原始緩存區共享一段序列;
以下示例:
一、咱們先建立一個容量爲10的緩存區charbuffer1
CharBuffer charbuffer1 = CharBuffer.allocate(10);
此時:mark = -1; position = 0; limit = 10; capacity = 10;
二、修改charbuffer1的position和limit值
charbuffer1.position(2).limit(5);
此時:mark = -1; position = 2; limit = 5; capacity = 10;
三、調用slice方法,對charbuffer1緩存區進行分割
CharBuffer charbuffer2 = charbuffer1.slice();
此時:
charbuffer1:mark = -1; position = 2; limit = 5; capacity = 10;
charbuffer2:mark = -1; position = 0; limit = 3; capacity = 3;
《Java NIO》