Buffer基本介绍
对数据读取、写入要用buffer,本质就是一个容器对象——数组(内存块)。
Channel提供从文件、网络读取数据的渠道,但是读取、写入都是经由Buffer
Buffer最常用的类
Buffer缓冲区状态变量
mark(标记):标记position位置,给reset用的,当回退到上一次可以调用reset,就会把mark赋值给position
position(位置):当前读写的位置
limit(上界):缓冲区现存元素的计数
capacity(容量):最大容量
0 <= mark <= position <= limit <= capacity
写入缓冲区
写入一个字节,position移动1格,position就是当前写入位置
读取缓冲区
调用buffer.flip() 切换到读模式,position就会移动到数据开头,limit会移动到数据结尾
每读一个字节,position移动1格,直到position=limit
Mark作用
调用buffer.mark()标志此时位置,然后再读取,position已经到limit
此时如果要从上一步开始读(也就是mark位置)
调用buffer.reset() 把position恢复到mark位置
还原缓冲区在这里插入图片描述
调用buffer.clear() 清除缓冲区,还原到最初状态
压缩缓冲区
调用buffer.compact() 申请一个新的缓冲区,把中间两个数据移到起始位置
代码演示
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
//输出缓冲区初始空间1024
System.out.println(buffer);//java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024]
buffer.putInt(1);
buffer.putInt(2);
buffer.putInt(3);
//输出已经写入的12个字节的缓冲区(1个int=4个byte)
System.out.println(buffer);//java.nio.HeapByteBuffer[pos=12 lim=1024 cap=1024]
//调用buffer.flip() 切换到读模式
buffer.flip();
//输出缓冲区可读字节
System.out.println(buffer.remaining());//remaining代表可读位可写位,limit - position,可读字节12
//输出缓冲区
System.out.println(buffer);//java.nio.HeapByteBuffer[pos=0 lim=12 cap=1024]
//取出数据
int myInt= buffer.getInt();
//记录mark位置
buffer.mark();
int myInt1= buffer.getInt();
int myInt2=buffer.getInt();
System.out.println(myInt);//1
System.out.println(myInt1);//2
System.out.println(myInt2);//3
//把position恢复到mark位置
buffer.reset();
int myInt3= buffer.getInt();
int myInt4= buffer.getInt();
System.out.println(myInt3);//2
System.out.println(myInt4);//3
System.out.println(buffer);//java.nio.HeapByteBuffer[pos=12 lim=12 cap=1024]
System.out.println(buffer.remaining());//这时,pos=lim,可读字节0
//清除缓冲区,还原到最初状态
buffer.clear();
System.out.println(buffer);//java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024]
System.out.println(buffer.remaining());//1024
}
输出结果
Channel与Buffer关系
https://blog.csdn.net/weixin_44371237/article/details/122284606