- limit(限制),第一个不应该读取或写入元素的index
- capacity,代表着缓冲区的大小
- position,是下一个读取或者写入操作的index
- remaining,剩余空间大小,remaining = limit - position
- mark,记录当前的position位置,mark如果在大于position或者limit时,会被丢弃
- reset方法,重置当前position为上次的position位置
测试limit的作用
/**
* put测试以及limit、capacity测试
*/
public static void putTest() {
char[] charArray = new char[] {'a', 'b', 'c', 'd'};
CharBuffer buffer = CharBuffer.wrap(charArray);
//此时capacity和limit都为4
System.out.println("CharBuffer.capacity:" + buffer.capacity());
System.out.println("CharBuffer.limit:" + buffer.limit());
//设置limit为3
buffer.limit(3);
//通过put设置数据
buffer.put('a');
buffer.put('b');
buffer.put('c');
//下面这一行报错
buffer.put('d');
buffer.put('e');
}
测试position的作用
public static void positionTest() {
char[] charArray = new char[] {'a', 'b', 'c', 'd'};
CharBuffer buffer = CharBuffer.wrap(charArray);
//此时capacity和limit都为4
System.out.println("CharBuffer.capacity:" + buffer.capacity());
System.out.println("CharBuffer.position:" + buffer.position());
//设置当前存储数据的position
buffer.position(2);
System.out.println("CharBuffer.capacity:" + buffer.capacity());
System.out.println("CharBuffer.position:" + buffer.position());
//原来c的位置被替换为e,并且position下移到下一个位置
buffer.put('e');
for(char a : charArray) {
System.out.println(a);
}
System.out.println("CharBuffer.position:" + buffer.position());
//原来d的位置被替换为f,并且position下移到下一个位置
buffer.put('f');
for(char a : charArray) {
System.out.println(a);
}
System.out.println("CharBuffer.position:" + buffer.position());
//已经满了,无法put
buffer.put('g');
}
mark和reset的作用
通过mark和reset可以很方便的在原来的地方重新写入或者读取缓存,这个特性在报文解析时很方便,如果是想读取ip报文内容,然后重写ip报文内容的时候,就显得十分方便;我们在ip报文头的位置设置一下mark,然后重这个位置开始读取,然后reset之后,在这个位置写入我们新加入的位置,这样就达到了篡改报文数据的目的
/**
* mark记录当前position的位置, reset重置上次记录的position位置
*/
public static void markAndResetTest() {
char[] charArray = new char[] {'a', 'b', 'c', 'd'};
CharBuffer buffer = CharBuffer.wrap(charArray);
//此时capacity和limit都为4
System.out.println("CharBuffer.capacity:" + buffer.capacity());
printArray(charArray);
buffer.position(1);
//记录当前开始设置数据的position
buffer.mark();
buffer.put('e');
buffer.put('f');
buffer.put('g');
printArray(charArray);
System.out.println("CharBuffer.remaining:" + buffer.remaining());
//重置到上次开始存数据的位置
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();
}
网友评论