1.线性结构
Buffer类是一个线性结构的类
2.元素
基本元素有:capacity limit position mark
capacity:目前buffer元素的数量
limit:记录buffer第一个不可读写的位置
position:记录buffer第一个可读写的位置
mark:position允许被重置的索引,不是必须定义,但是不会比position大
新创建的buffer元素初始值:
通常position为0,mark为未定义,limit可能为0、未定义、或者一些其他值(取决于buffer类型以及构造函数)
3.异常:
BufferUnderflowException:get操作元素超出了limit限制
BufferOverflowException:put操作元素超出了limit限制
InvalidMarkException:未定义mark,却调用reset
ReadOnlyBufferException:尝试操作一个只读的buffer,可以通过isReadOnly来判断是否是只读
但是一个只读的buffer,其mark,position,limit是可变的,而内容不能改变
4.操作:
三个基本操作:clear flip rewind
clear:用于channel-read或者相关的put操作之前(setlimit = capacity; positon = 0;)
flip:用于channel-write或者相关get操作之前(setlimit = position; position = 0;)
rewind:用于重新读取数据之前(limit不变; position= 0;)
5.其他:
(1)非线程安全
(2)支持invocation chain;如:b.flip().position(23).limit(42)(函数返回当前对象本身)
实例代码(以java String类和ByteBuffer类相互转换为例):
/**
* @author 15120124
* string 转为 ByteBuffer
*/
public ByteBuffer string2ByteBuffer(String str){
return ByteBuffer.wrap(str.getBytes());
}
/**
* @author ljyll122
* ByteBuffer 转为 string
*/
public String byteBuffer2String(ByteBuffer byteBuff){
Charset charSet = null;
CharsetDecoder decoder = null;
CharBuffer charBuff = null;
try{
charSet = Charset.forName("UTF-8");
decoder = charSet.newDecoder();
byteBuff.flip();
charBuff = decoder.decode(byteBuff);
return charBuff.toString();
}catch(Exception e){
String errorStr = "error";
System.out.println("error" + e);
return errorStr + e;
}
}