程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java NIO中的緩沖區Buffer(二)創建/復制緩沖區

Java NIO中的緩沖區Buffer(二)創建/復制緩沖區

編輯:關於JAVA

Java NIO中的緩沖區Buffer(二)創建/復制緩沖區。本站提示廣大學習愛好者:(Java NIO中的緩沖區Buffer(二)創建/復制緩沖區)文章只能為提供參考,不一定能成為您想要的結果。以下是Java NIO中的緩沖區Buffer(二)創建/復制緩沖區正文


創建緩沖區的方式

主要有以下兩種方式創建緩沖區:

1、調用allocate方法

2、調用wrap方法

我們將以charBuffer為例,闡述各個方法的含義;

allocate方法創建緩沖區

調用allocate方法實際上會返回new HeapCharBuffer(capacity, capacity)對象;

緩存空間存儲在CharBuffer類的成員屬性char[] hb數組裡,即JVM堆裡;

如下示例,創建了一個容量大小為10的CharBuffer:

CharBuffer bf = CharBuffer.allocate(10);

allocate方法其實比較簡單,不過有點需要注意的是,allocate方法除了可以分配JVM堆空間,還可以分配直接內存空間(如ByteBuffer,可以調用allocateDirect方法分配直接內存),其內部是通過調用unsafe.allocateMemory方法實現直接內存分配的,該空間不在JVM堆內部,後續會做更加詳細的說明;不過可以稍微提醒一點,如果是直接內存空間的話,調用hasArray()方法會返回false;

wrap方法創建緩沖區

調用wrap方法實際上會也會返回new HeapCharBuffer(array, offset, length)對象;

與allocate方法的區別是,它的緩存存儲空間是外部傳入的;

如下示例,創建了一個容量大小為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;

復制緩沖區的方式

主要有以下三種方式復制緩沖區:

1、調用duplicate方法

2、調用asReadOnlyBuffer方法

3、調用slice方法

我們將以charBuffer為例,闡述各個方法的含義;

duplicate方法復制緩沖區

調用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緩存區的數據,結果打印如下:

abc
abc asReadOnlyBuffer方法復制緩沖區

調用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

輸出結果:

abc
abc
Exception in thread "main" java.nio.ReadOnlyBufferException
    at java.nio.HeapCharBufferR.put(HeapCharBufferR.java:166)
    at nio.Main.main(Main.java:21) slice方法復制緩沖區

slice方法其實是用於分割緩存區的,該方法創建了一個從原始緩沖區的當前位置開始的新緩沖區,並且其容量是原始緩沖區的剩余元素數量(limit-position);

該緩存區與原始緩存區共享一段序列;

如下示例:

1、我們先創建一個容量為10的緩存區charbuffer1

CharBuffer charbuffer1 = CharBuffer.allocate(10);

此時:mark = -1; position = 0; limit = 10; capacity = 10;

2、修改charbuffer1的position和limit值

charbuffer1.position(2).limit(5);

此時:mark = -1; position = 2; limit = 5; capacity = 10;

3、調用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》

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved