ByteBuffer使用
package zll.buffer;
import java.nio.ByteBuffer;
import org.junit.Test;
/**
* 这个类是测试ByteBuffer字节缓冲区的
* 对于缓冲区,有三个元素
*
* 容量 capcity 指的是创建缓冲区的大小上限
* 限制 limit
* 位置 position 通过位置来灵活操作缓冲区里数据
*
* @author zll
*
*/
public class TestDemo {
/*
* allocate是创建缓冲区的方法,并指定容量。
* put方法是存储数据的方法,此外,每调用put方法,position+1;
* get()是根据当前的positon位置取到数据,此外,get()也会使得postion+1
*/
@Test
public void test01(){
ByteBuffer buffer = ByteBuffer.allocate(10);
byte b1 = 1;
byte b2 = 2;
buffer.put(b1);
buffer.put(b2);
System.out.println(buffer.get());
System.out.println("");
}
/*
*put 存数据,get 取数据,利用position和limit配合使用取出数据
*/
@Test
public void test02(){
ByteBuffer buffer = ByteBuffer.allocate(10);
byte b1 = 1;
byte b2 =2;
buffer.put(b1);
buffer.put(b2);
//重置position
buffer.position(0);
//限制位的作用:使position的值不会超过limit,常用于避免取到空数据
buffer.limit(2);
System.out.println(buffer.get());
System.out.println(buffer.get());
System.out.println(buffer.get());
}
/*
* 字节缓冲区,可以存储字节数组,另一个字节缓冲区
* 此外,也可以存储整形等其他基本类型,但不建议使用
*/
@Test
public void test03(){
ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("holle".getBytes());
buffer.position(0);
buffer.limit(5);
System.out.println(buffer.get());
}
/*
* filp()重点掌握
*/
@Test
public void test04(){
ByteBuffer buffer = ByteBuffer.allocate(10);
byte b1 = 1;
byte b2 =2;
buffer.put(b1);
buffer.put(b2);
//这个方法相当于先把limit置为当前的positon位置,然后再把position置为0
buffer.flip();
System.out.println(buffer.get());
System.out.println(buffer.get());
System.out.println(buffer.get());
}
/*
* wrap方法重点掌握
*/
@Test
public void test05(){
//wrap 相当于第一步,创建了一个10字节大小缓冲区,和字节数组是相等的,第二步,调用了flip方法
ByteBuffer buffer = ByteBuffer.wrap("helloword".getBytes());
System.out.println(buffer.get());
}
/*
* clear 方法。这个方法并不能达到清除的目的,原因是,当clear方法之后,
* 会把position位置置为0,limit位置=capacity位置,并且原缓冲区的数据不清除,还在。
* 所以,要向真正实现clear,需要和flip配合使用。否则会读到历史数据
*/
@Test
public void test06(){
ByteBuffer buffer = ByteBuffer.allocate(10);
byte b1 = 1;
byte b2 =2;
buffer.put(b1);
buffer.put(b2);
buffer.clear();
System.out.println(buffer.get());
System.out.println(buffer.get());
System.out.println(buffer.get());
}
/*
* 利用hasRemaining()取数据,这个方法重点掌握
*/
@Test
public void test07(){
ByteBuffer buffer = ByteBuffer.wrap("helloword".getBytes());
//hasRemaining() 检查当年前的positon位置和limit限制位之间是否还有元素,如果有,就返回true
while(buffer.hasRemaining()){
System.out.println(buffer.get());
}
}
}