Buffer管理著給定數(shù)目的數(shù)據(jù)元素槐瑞。但是在大多數(shù)情況下熙涤,我們只關(guān)心其中的一部分?jǐn)?shù)據(jù)。就像是,當(dāng)我們想要向池子里倒水時(shí)祠挫,水盆里的水那槽,只盛了一半。但我們需要追蹤一些信息等舔,buffer中已經(jīng)有的數(shù)據(jù)骚灸,下一個(gè)處理哪個(gè)數(shù)據(jù)?position屬性負(fù)責(zé)處理這個(gè)信息慌植。當(dāng)處理put(向buffer中寫入數(shù)據(jù))或者get方法(從buffer中獲取數(shù)據(jù))的時(shí)候甚牲,position就會(huì)更新。
盡管在JAVA NIO BUFFER(一)中蝶柿,列表中沒(méi)有put和get方法丈钙。但是每個(gè)Buffer都包含這兩個(gè)方法,因?yàn)槊總€(gè)buffer的實(shí)現(xiàn)不同只锭,需要處理不同的數(shù)據(jù)類型著恩,沒(méi)法被聲明為抽象方法(nio在jdk1.4被引入,泛型是1.5)蜻展。我們用ByteBuffer作為例子喉誊,來(lái)看這兩個(gè)方法的聲明
public abstract class ByteBuffer extends Buffer implements Comparable {
//列出了一部分api
public abstract byte get();
public abstract byte get(int index);
public abstract ByteBuffer put(byte b);
public abstract ByteBuffer put(int index, byte b);
}
如果不指定具體的位置,put和get就會(huì)操作在現(xiàn)有的position屬性上纵顾,并將position加1伍茄。如果超出了capacity。如果是讀操作就會(huì)拋出BufferOverflowException,寫操作就會(huì)BufferUnderflowException.如果是任意操作施逾,也會(huì)拋出一個(gè)IndexOutOfBoundsException.
讓我們?cè)囍鴮?duì)ByteBuffer中寫入數(shù)據(jù)敷矫,如果執(zhí)行下面的命令,JAVA NIO BUFFER(一)中的概念圖汉额,就會(huì)變成如下的樣子曹仗。
buffer.put((byte)'H').put((byte)'e').put((byte)'l').put((byte)'l').put((byte)'o');
猜一猜,如果執(zhí)行這個(gè)命令
buffer.put(0,(byte)'M').put((byte)'w');
會(huì)變成什么樣子蠕搜?
會(huì)變成這樣怎茫!,第一個(gè)把0位置的H替換為M妓灌,然后緊接著的put操作查看到了position在5位置轨蛤,把5位置寫入W,然后position自加變?yōu)?.