最近对VAS中的socket 中的包头从16位调整为32位,此调整涉及到了Nio ByteBuffer 。
* capacity:指buffer最大能放大少数据,此一般在buffer在创建时被指定
* limit:指buffer在进行读写操作时,不能超过此下标,在写时limit 与 capacity一般相等,当读数据时,limit为有效数据的长度。
* position:指操作的当前下标 可以理解为指针,读写一个数据,指针下移
* mark:指临时存放下标的指,当进行mark()操作时,mark会保存position的值,当进行reset()操作时,又把mark的指赋予position值 ,mark的值总是小于等于position的值。
* flip: 把limit设置为当前position,同时把position设置为0 在读出数据前调用 即把指针放到开始位置,读数据时只读到限制位置
* compact:把当前从position位置到limit位置的字节移动到从0开始
* clear:重置了缓冲区的主要索引值.不必为了每次读写都创建新的缓冲区,那样做会降低性能
0 <= mark <= position <= limit <= capacity
存在的疑问:mark() ,reset() 方法,在代码测试中,测试不出使用mark,reset方法的场景,不知是如何使用??
package com.binary;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
public class ByteBufferTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ByteBuffer bb = ByteBuffer.allocate(8);
ByteBuffer ccBuffer = ByteBuffer.allocate(8);
String infoString = "";
String testStrString = "wuxhtest";
bb = ByteBuffer.wrap(testStrString.getBytes());
byte[] tmp = new byte[8];
tmp = bb.array();
System.out.println("length:" + testStrString.length() + " "
+ new String(tmp));
log("当字节数组包装后", bb);
// 读ByteBuffer的数据
System.out.println((char) bb.get());
System.out.println((char) bb.get());
log("get读取数据后", bb);
bb.mark();
log("mark标记后", bb);
// bb.flip();
// log("flip后", bb);
System.out.println((char) bb.get());
System.out.println((char) bb.get());
log("get读取数据后", bb);
bb.reset();
log("reset后", bb);
// 把limit设为当前position,把position设为0,一般在从Buffer读出数据前调用。
bb.flip();
log("flip后", bb);
bb.compact();
log("compact后", bb);
// 放入数据
bb.put((byte) 12);
try {
log("put 放入数据 " + new String(bb.array(), "GBK"), bb);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bb.clear();
log("clear后", bb);
}
public static void log(String info, ByteBuffer bb) {
System.out.println("info:" + info + ": position:" + bb.position()
+ " limit:" + bb.limit() + " capacity:" + bb.capacity()
+ " mark:" + bb.mark());
}
}
执行结果:
写道
length:8 wuxhtest
info:当字节数组包装后: position:0 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]
w
u
info:get读取数据后: position:2 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=2 lim=8 cap=8]
info:mark标记后: position:2 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=2 lim=8 cap=8]
x
h
info:get读取数据后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:reset后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:flip后: position:0 limit:4 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=4 cap=8]
info:compact后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:put 放入数据 wuxhest: position:5 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=5 lim=8 cap=8]
info:clear后: position:0 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]
info:当字节数组包装后: position:0 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]
w
u
info:get读取数据后: position:2 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=2 lim=8 cap=8]
info:mark标记后: position:2 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=2 lim=8 cap=8]
x
h
info:get读取数据后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:reset后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:flip后: position:0 limit:4 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=4 cap=8]
info:compact后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:put 放入数据 wuxhest: position:5 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=5 lim=8 cap=8]
info:clear后: position:0 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]