- limit(限制),第一個(gè)不應(yīng)該讀取或?qū)懭朐氐膇ndex
- capacity,代表著緩沖區(qū)的大小
- position,是下一個(gè)讀取或者寫入操作的index
- remaining悔详,剩余空間大小,remaining = limit - position
- mark雷蹂,記錄當(dāng)前的position位置伟端,mark如果在大于position或者limit時(shí),會(huì)被丟棄
- reset方法匪煌,重置當(dāng)前position為上次的position位置
測(cè)試limit的作用
/**
* put測(cè)試以及l(fā)imit责蝠、capacity測(cè)試
*/
public static void putTest() {
char[] charArray = new char[] {'a', 'b', 'c', 'd'};
CharBuffer buffer = CharBuffer.wrap(charArray);
//此時(shí)capacity和limit都為4
System.out.println("CharBuffer.capacity:" + buffer.capacity());
System.out.println("CharBuffer.limit:" + buffer.limit());
//設(shè)置limit為3
buffer.limit(3);
//通過put設(shè)置數(shù)據(jù)
buffer.put('a');
buffer.put('b');
buffer.put('c');
//下面這一行報(bào)錯(cuò)
buffer.put('d');
buffer.put('e');
}
測(cè)試position的作用
public static void positionTest() {
char[] charArray = new char[] {'a', 'b', 'c', 'd'};
CharBuffer buffer = CharBuffer.wrap(charArray);
//此時(shí)capacity和limit都為4
System.out.println("CharBuffer.capacity:" + buffer.capacity());
System.out.println("CharBuffer.position:" + buffer.position());
//設(shè)置當(dāng)前存儲(chǔ)數(shù)據(jù)的position
buffer.position(2);
System.out.println("CharBuffer.capacity:" + buffer.capacity());
System.out.println("CharBuffer.position:" + buffer.position());
//原來c的位置被替換為e,并且position下移到下一個(gè)位置
buffer.put('e');
for(char a : charArray) {
System.out.println(a);
}
System.out.println("CharBuffer.position:" + buffer.position());
//原來d的位置被替換為f萎庭,并且position下移到下一個(gè)位置
buffer.put('f');
for(char a : charArray) {
System.out.println(a);
}
System.out.println("CharBuffer.position:" + buffer.position());
//已經(jīng)滿了霜医,無法put
buffer.put('g');
}
mark和reset的作用
通過mark和reset可以很方便的在原來的地方重新寫入或者讀取緩存,這個(gè)特性在報(bào)文解析時(shí)很方便驳规,如果是想讀取ip報(bào)文內(nèi)容肴敛,然后重寫ip報(bào)文內(nèi)容的時(shí)候,就顯得十分方便吗购;我們?cè)趇p報(bào)文頭的位置設(shè)置一下mark医男,然后重這個(gè)位置開始讀取,然后reset之后捻勉,在這個(gè)位置寫入我們新加入的位置镀梭,這樣就達(dá)到了篡改報(bào)文數(shù)據(jù)的目的
/**
* mark記錄當(dāng)前position的位置, reset重置上次記錄的position位置
*/
public static void markAndResetTest() {
char[] charArray = new char[] {'a', 'b', 'c', 'd'};
CharBuffer buffer = CharBuffer.wrap(charArray);
//此時(shí)capacity和limit都為4
System.out.println("CharBuffer.capacity:" + buffer.capacity());
printArray(charArray);
buffer.position(1);
//記錄當(dāng)前開始設(shè)置數(shù)據(jù)的position
buffer.mark();
buffer.put('e');
buffer.put('f');
buffer.put('g');
printArray(charArray);
System.out.println("CharBuffer.remaining:" + buffer.remaining());
//重置到上次開始存數(shù)據(jù)的位置
buffer.reset();
buffer.put('h');
buffer.put('i');
buffer.put('j');
printArray(charArray);
System.out.println("CharBuffer.remaining:" + buffer.remaining());
}
private static void printArray(char[] charArray) {
for(char a : charArray) {
System.out.print(a);
}
System.out.println();
}