第二章 緩衝區(10)

2021-05-23 12:39:16 字數 3375 閱讀 4129

2.3 複製

buffer物件

如前面討論的那樣,我們能夠建立管理外部陣列資料的buffer

物件。但是

buffer

物件不僅能管理外部陣列,也能管理其他的

buffer

物件。當建立乙個管理其他

buffer

物件的buffer

物件時,這個

buffer

物件稱為檢視

buffer

物件。大多數的檢視

buffer

物件都是

bytebuffer

物件的檢視(參看

2.4.3

小節)。在陷入

bytebuffer

的檢視buffer

的細節之前,我們先將目標放在所有

buffer

型別的共同點上。

檢視buffer

通常通過呼叫已建立的

buffer

物件方法來建立。通過呼叫已建立的

buffer

物件的工廠方法來建立檢視

buffer

,意味著被建立的檢視

buffer

能夠訪問原始的

buffer

物件的實現細節。檢視

buffer

將能直接訪問資料元素,而不需要呼叫原始

buffer

物件的put

和get

方法,不管它們是儲存在陣列中還是其他的形式中。如果

buffer

物件是直接建立於核心中的,檢視

buffer

將擁有跟原始

buffer

一樣高的效率,對於對映

buffer

檢視buffer

也一樣(對映

buffer

參見第三章)。

在這一小節中,我們將使用charbuffer

作為例子,其他的基本型別的

buffer

跟charbuffer

的操作大同小異(其他型別的

buffer

參見圖2.1)。

public abstract class charbuffer 

extends buffer implements charsequence,comparable

duplicate方法建立乙個跟原始

buffer

一樣的buffer

物件。兩個

buffer

物件共享同樣的資料,擁有同樣的容量,但是每個物件擁有各自的

position

、limit

和mark

屬性。在乙個

buffer

物件中對資料的修改將反映在另外乙個

buffer

物件上。這個副本具有跟原始的

buffer

物件一樣的檢視。如果原始的

buffer

物件是唯讀的,或者直接分配於核心中,副本將繼承這些屬性。在

2.4節中將分析直接分配與核心中的

buffer

物件。

注意:duplicate方法建立的

buffer

不會複製原始

buffer

的資料。副本和原始

buffer

物件將會操作於同樣的資料上。

原始的buffer

物件跟它的副本的關係如圖

2.12

所示。圖中的結果是有下面的**產生的。

charbuffer buffer=charbuffer.allocate(8);

buffer.position(3).limit(6).mark().position(5);

buffer.clear();

圖2.12 

建立buffer

的副本

你能通過呼叫buffer

物件的asreadonlybuffer

方法來生成乙個唯讀的

buffer

物件。這個物件跟

duplicate

方法生成的

buffer

一樣,除了這個新建的

buffer

不容許使用

put方法,同時

buffer

的isreadonly

方法將返回

true

。試圖對唯讀

buffer

呼叫put

方法將導致丟擲

readonlybufferexception

異常。

注意:如果唯讀的buffer

跟乙個可寫的

buffer

共享資料,或者擁有乙個後備的陣列,那麼對可寫的

buffer

物件或者後備陣列的修改將反映在所有關聯的

buffer

物件上,包括唯讀

buffer

物件。

對buffer

物件進行分割(

slice

)操作,跟

duplicate

方法相似,也將建立乙個新的

buffer

物件,但是這個

buffer

物件將從原始

buffer

物件的position

位置開始,這個

buffer

物件的容量是原始

buffer

的剩餘資料的數量(

limit-position

)。這個新建立的

buffer

物件共享原始的

buffer

物件的子集。分割的

buffer

物件將繼承原始

buffer

物件包括唯讀、開闢位置的屬性。圖

2.13

展示了由下面**產生的分割

buffer。

charbuffer buffer=charbuffer.allocate(8);

buffer.position(3).limit(5);

charbuffer slicebuffer=buffer.slice();

圖2.13 

分割buffer物件

為了建立乙個對映在陣列12~20位置(

9個資料)的

buffer

物件,可以使用下面的**。

char mybuffer=new char[100];

charbuffer cb=charbuffer.wrap(mybuffer);

cb.position(12).limit(21);

charbuffer sliced=cb.slice();

更詳細關於檢視buffer

的討論見

2.4.3

小節。

20 第二章 索引 緩衝

lucene在新增或刪除文件時,並不會立即將這些操作寫入磁碟,而是在記憶體中先做快取。毋庸置疑,這是針對io效能問題而作出的優良策略。在三種情況下,lucene會對緩衝區進行flush操作 1.快取區記憶體空間已滿 通過indexwriter的setrambuffersizemb 設定緩衝區大小。預...

NIO 筆記二 緩衝區

乙個 buffer 物件是固定數量的資料的容器。其作用是乙個儲存器,或者分段運輸區,在這裡資料可被儲存並在之後用於檢索。對於每個非布林原始資料型別都有乙個緩衝區類。儘管緩衝區作用於它們儲存的原始資料型別,但緩衝區十分傾向於處理位元組。非位元組緩衝區可以在後台執行從位元組或到位元組的轉換,這取決於緩衝...

什麼是緩衝區溢位 (二)

要知道什麼是緩衝區溢位,首先要知道什麼是緩衝區,緩衝區,簡單說來是一塊連續的計算機記憶體區域,可以儲存相同資料型別的多個例項。你一定用strcpy拷貝過字串吧?那,如果拷貝時目的字串的緩衝區的長度小於源字串的長度,會發生什麼呢?對,源字串中多餘的字元會覆蓋掉程序的其它資料。這種現象就叫緩衝區溢位。根...