Buffer 的常用方法:
方 法 描 述
Buffer clear() :清空缓冲区并返回对缓冲区的引用
Buffer flip() :将缓冲区的界限设置为当前位置,并将当前位置充值为 0
int capacity(): 返回 Buffer 的 capacity 大小
boolean hasRemaining(): 判断缓冲区中是否还有元素
int limit() :返回 Buffer 的界限(limit) 的位置
Buffer mark(): 对缓冲区设置标记
int position():返回缓冲区的当前位置 position
Buffer position(int n) :将设置缓冲区的当前位置为 n , 并返回修改后的 Buffer 对象
int remaining() :返回 position 和 limit 之间的元素个数
Buffer reset() :将位置 position 转到以前设置的 mark 所在的位置
Buffer rewind() :可以在读或者写的模式写将position的值重新设置为0,limit和capacity不变, 取消设置的 mark
6.向ButyBuffer中存入数据:put():存入数据
示例代码:
/**
- 2.@desc 向缓冲区中存入数据
*/
public static void putData(){
ByteBuffer byteBuffer=ByteBuffer.allocate(1024);//开辟一个大小为1kb的且是存储byte类型数据的缓存区
String str=“IWill”;
byte[] bytes = str.getBytes();//将字符串转换为字符数组
byteBuffer.put(bytes);//将数据存入到缓冲区中
System.out.println(“容量:”+byteBuffer.capacity());
System.out.println(“限制:”+byteBuffer.limit());
System.out.println(“位置:”+byteBuffer.position());
}
7.从ByteBuffer中取出数据:get():取出数据,flip():切换成读模式
示例代码:
/**
3.@desc重缓存区读取数据:可参阅buffer的基本属性图
*/
public static void getData()
{
ByteBuffer byteBuffer=ByteBuffer.allocate(10);//开辟一个大小为1kb的且是存储byte类型数据的缓存区
String str=“IWill”;
byte[] bytes = str.getBytes();//将字符串转换为字符数组
byteBuffer.put(bytes);//将数据存入到缓冲区中
System.out.println(byteBuffer);//1.没有切换模式的时候:pos=5 lim=10 cap=10byteBuffer.flip();//切换成读的模式
System.out.println(byteBuffer);//2.切换模式之后的时候:pos=0 lim=5 cap=10//3.开始读取数据
byte []bst=new byte[byteBuffer.limit()];
byteBuffer.get(bst);//以这么大长度的数据开始读入
System.out.println(byteBuffer);//pos=5 lim=5 cap=10:pos=5是因为下一个要读取的数据的索引for(int i =0;i<byteBuffer.position();i++)//从开始的位置到下一个要读取的数据的索引之间的数据即可我们最终需要读取的数据
{
System.out.print((char)byteBuffer.get(i)+"\t");//分别取出每一个字符然后输出在控制台上
}
}
8.rewind():可以在读或者写的模式写将position的值重新设置为0,limit和capacity不变
示例代码:
/**
4.@desc:rewind():可以在读或者写的模式写将position的值重新设置为0,limit和capacity不变
*/
public static void getInfoByRewmind(){ByteBuffer byteBuffer=ByteBuffer.allocate(10);//开辟一个大小为1kb的且是存储byte类型数据的缓存区
String str=“IWill”;
byte[] bytes = str.getBytes();//将字符串转换为字符数组
byteBuffer.put(bytes);//将数据存入到缓冲区中
System.out.println(byteBuffer);//1.没有切换模式的时候:pos=5 lim=10 cap=10byteBuffer.flip();//切换成读的模式
System.out.println(byteBuffer);//2.切换模式之后的时候:pos=0 lim=5 cap=10byte []bst=new byte[byteBuffer.limit()];
byteBuffer.get(bst);//开始读取数据
System.out.println(byteBuffer);byteBuffer.rewind();//可以在读或者写的模式写将position的值重新设置为0,limit和capacity不变
System.out.println(byteBuffer);String str02=“hhd”;//并不影响下一次的存储
byteBuffer.put(str02.getBytes());
System.out.println(byteBuffer);
}
9.clear():重置缓冲区,但是不清空里面的数据,里面的数据此时处于被遗忘状态
示例代码:
/**
5.@desc:clear():重置缓冲区,但是不清空里面的数据,里面的数据此时处于被遗忘状态
*/
public static void getInfoByClear()
{
//1.存入数据
ByteBuffer byteBuffer=ByteBuffer.allocate(10);
String str=“IWill”;
byteBuffer.put(str.getBytes());
System.out.println(byteBuffer);//2.读取缓冲区
byteBuffer.flip();
byte []bts=new byte[byteBuffer.limit()];
byteBuffer.get(bts);
System.out.println(byteBuffer);//3.重置缓冲区
byteBuffer.clear();
System.out.println(byteBuffer);//4.将缓冲区中的数据打印在控制台上
System.out.println((char)byteBuffer.get(1));
}
10.mark():标记position的位置;reset():恢复到标记的position的位置
示例代码:
/**
6.@desc :mark():标记position的位置;reset():恢复到标记的position的位置
*/
public static void getInfoByMark()
{
ByteBuffer byteBuffer=ByteBuffer.allocate(10);
System.out.println(“最开始的缓冲区:”+byteBuffer);
//1.存入数据
String str=“IWill”;
byteBuffer.put(str.getBytes());
System.out.println(“存入数据的缓冲区:”+byteBuffer);//2.切换成读的模式
byteBuffer.flip();
//2.1从缓存区中读取3个数据
byte []bst=new byte[byteBuffer.limit()];
System.out.println(“缓存区中的3个数据:”+byteBuffer.get(bst, 0, 3));//3.标记positon的位置
byteBuffer.mark();//因为上一句的执行结果为:pos=3 lim=5 cap=10,所以此时mark()的作用是将pos=3的位置作为下次操作的起始的位置,于是执行完下一句的结果为:pos=5 lim=5 cap=10
System.out.println(“标记后的缓存区:”+byteBuffer.get(bst, 2, 2));//4.恢复到标记的位置
byteBuffer.reset();//恢复后的结果会与标记之前的结果一样:pos=3 lim=5 cap=10
System.out.println(“恢复标记后的缓存区:”+byteBuffer);//5.缓存区中还有能被操作的数据
if (byteBuffer.hasRemaining())
{
System.out.println(“还有:”+byteBuffer.remaining()+“个”);
//将他们取出来打印在控制台上
for (int i = byteBuffer.position(); i <byteBuffer.limit(); i++)
{
System.out.println((char)byteBuffer.get(i));
}
}
}