通過(guò)數(shù)組的形式存儲(chǔ)數(shù)據(jù),可以實(shí)現(xiàn)Buffer的功能横漏,進(jìn)而創(chuàng)建Buffer對(duì)象纫塌,但是Buffer可不僅僅只能通過(guò)數(shù)組才能實(shí)現(xiàn)。Buffer還可以管理其它buffer的數(shù)組桨昙。一旦這么做检号,就是一個(gè)view buffer對(duì)象。大多數(shù)view buffers是bytebuffers的視圖蛙酪。
View Buffers通常通過(guò)調(diào)用已經(jīng)存在buffer的方法生成齐苛。創(chuàng)建的view buffer不僅可以通過(guò)get,put方法操作原有的buffer桂塞,而且如果原來(lái)的buffer是直接的凹蜂,view buffer也可以得到同樣的性能優(yōu)勢(shì)。以CharBuffer為例阁危,查看它的相關(guān)方法聲明:
public abstract class CharBuffer extends Buffer implements CharSequence, Comparable {
public abstract CharBuffer duplicate();
public abstract CharBuffer asReadOnlyBuffer();
public abstract CharBuffer slice();
}
duplicate方法創(chuàng)建了一個(gè)跟原來(lái)相似的新的buffer玛痊。兩個(gè)buffer共享數(shù)據(jù),有相同的容量狂打,但是兩個(gè)buffer獨(dú)自管理自己的position擂煞,limit和mark。對(duì)數(shù)據(jù)的更改會(huì)反應(yīng)在兩個(gè)buffer之上趴乡。
你也可以通過(guò)asReadOnlyBuffer來(lái)創(chuàng)建一個(gè)只讀的CharBuffer对省,大部分和duplicate相同蝗拿,新的buffer會(huì)禁用put方法,而且它的isReadOnly方法會(huì)返回true蒿涎。如果試圖破壞這個(gè)CharBuffer的只讀屬性哀托,會(huì)拋出ReadOnlyBufferException,值得一提的是劳秋,對(duì)數(shù)據(jù)元素的更改也會(huì)反應(yīng)在只讀的CharBuffer上仓手。
slice方法跟duplicate方法也很相似,但是slice方法返回的是一部分俗批,下圖說(shuō)明一個(gè)原本大小為8的CharBuffer被slice之后俗或,生成的新CharBuffer的屬性
CharBuffer buffer = CharBuffer.allocate(8);
buffer.position(3).limit(5);
CharBuffer sliceBuffer = buffer.slice();
這些方法都不會(huì)對(duì)mark屬性進(jìn)行操作市怎。