Buffer是用于特定原始类型的数据的容器。 它的实质就是一组数组,用于存储不同类型的数据。
缓冲区类型除了Boolean值类型外,其余基本类型都含有。
NIO中定义的抽象缓冲区对象如下(均继承至Buffer抽象类):
上述类均为抽象类,它们的实现还分有直接缓冲区和非直接缓冲区。
进行写操作时,limit=category, limit 表示的是可以写的地址范围。
而 position 则表示当前写的索引,每写一个字节position则+1。
进行读操作时,limit=position, limit 此时则表示可读取的范围,此时范围则会被赋值为写的 position 。
而当 position 赋值完给 limit 后, position 则置零。在读操作中 position 则表示读的索引。
mark <= position <= limit <= capacity
@Test
public void markTest(){
String str = "abcde";
ByteBuffer buf = ByteBuffer.allocate(1024);
byte[] bytes = new byte[10];
buf.put(str.getBytes());
//切换到读模式
buf.flip();
//获取buf的两个字节
buf.get(bytes, 0, 2);
System.out.println(new String(bytes));
//标记position的位置
buf.mark();
//获取buf的两个字节
buf.get(bytes, 2, 2);
System.out.println(new String(bytes));
System.out.println(buf.position());
//回到position=2的位置
buf.reset();
System.out.println(buf.position());
}
@Test
public void bufferMethodTest(){
String str = "abcde";
//声明一个Byte缓冲区(非直接缓冲区),并设置缓冲区大小为1024
ByteBuffer buf = ByteBuffer.allocate(1024);
//直接缓冲区申请方式
//ByteBuffer.allocateDirect(1024);
System.out.println("-------------------------allocate------------------------");
//0
System.out.println(buf.position());
//1024
System.out.println(buf.limit());
//1024
System.out.println(buf.capacity());
System.out.println("-------------------------put------------------------");
//把str的数据放入缓冲区
buf.put(str.getBytes());
//5
System.out.println(buf.position());
//1024
System.out.println(buf.limit());
//1024
System.out.println(buf.capacity());
//3.切换读取数据模式
buf.flip();
System.out.println("-------------------------get------------------------");
byte[] bytes = new byte[20];
//读取缓冲区理的5个字节
buf.get(bytes,0, buf.limit());
//5,表示数据读到的位置
System.out.println(buf.position());
//5.表示可以读的位置
System.out.println(buf.limit());
System.out.println(buf.capacity());
//5. rewind: 可重读
buf.rewind();
System.out.println("-------------------------rewind------------------------");
//position回到0
System.out.println(buf.position());
//5.表示可以读的位置,5
System.out.println(buf.limit());
System.out.println(buf.capacity());
//clear(): 清空缓存区,但数据任然存在,只是把position和limit重置为最初状态。
buf.clear();
System.out.println("-------------------------clear------------------------");
//postion变为0
System.out.println(buf.position());
//1024
System.out.println(buf.limit());
System.out.println(buf.capacity());
}