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拷貝過字串吧?那,如果拷貝時目的字串的緩衝區的長度小於源字串的長度,會發生什麼呢?對,源字串中多餘的字元會覆蓋掉程序的其它資料。這種現象就叫緩衝區溢位。根...