Buffer缓冲区 | 张扎瓦的博客

Buffer缓冲区

NIO 中Buffer缓冲区介绍及基本操作


简介

Buffer(缓冲区),在Java NIO中负责数据的存取。缓冲区本质上就是数组,用于存储不同数据类型的数据。

根据数据类型不同(boolean除外),提供了相应类型的缓冲区

  1. ByteBuffer
  2. CharBuffer
  3. ShortBuffer
  4. IntBuffer
  5. LongBuffer
  6. FloatBuffer
  7. DoubleBuffer

缓冲区可以通过allocate()获取缓冲区

1
2
// 创建一个指定大小的缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

直接缓冲区与非直接缓冲区

通过allocate()方式创建的缓冲区,称为非直接缓冲区,这种缓冲区是在jvm中创建的。

非直接缓冲区

通过allocateDirect()创建的缓冲区,称为直接缓冲区,这种缓冲区是在物理内存中直接创建的。

直接缓冲区

使用allocateDirect()所需要的成本比allocate()要高,而且无法使用垃圾自动回收。

四个核心属性

  1. capacity:容量,表示缓冲区中最大存储数据的容量,一旦声明不能改变
  2. limit:界限,表示缓冲区中可以操作数据的大小。(limit后数据不能进行读写)。
  3. position:位置,表示缓冲区中正在操作数据的位置。
  4. mark:标记,表示当前position的位置,可以通过reset()恢复到mark的位置

四个属性的关系:0 <= mark <= position <= limit <= capacity

核心属性关系

常用操作

allocate():创建缓冲区

1
2
3
4
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
System.out.println("position: "+byteBuffer.position()); //0
System.out.println("limit: "+byteBuffer.limit()); //1024
System.out.println("capacity: "+byteBuffer.capacity()); //1024

put():向缓冲区中写数据

1
2
3
4
5
String name = "tom";
byteBuffer.put(name.getBytes());
System.out.println("position: "+byteBuffer.position()); //3
System.out.println("limit: "+byteBuffer.limit()); //1024
System.out.println("capacity: "+byteBuffer.capacity()); //1024

flip():切换到读数据模式

1
2
3
4
byteBuffer.flip();
System.out.println("position: "+byteBuffer.position()); //0
System.out.println("limit: "+byteBuffer.limit()); //3
System.out.println("capacity: "+byteBuffer.capacity()); //1024

get():读取缓冲区中的数据

1
2
3
4
5
6
byte[] dst = new byte[byteBuffer.limit()];
byteBuffer.get(dst);
System.out.println("buffer中的数据:"+new String(dst, 0, dst.length));
System.out.println("position: "+byteBuffer.position()); //3
System.out.println("limit: "+byteBuffer.limit()); //3
System.out.println("capacity: "+byteBuffer.capacity()); //1024

rewind():重新从头读取数据

1
2
3
4
byteBuffer.rewind();
System.out.println("position: "+byteBuffer.position()); //0
System.out.println("limit: "+byteBuffer.limit()); //3
System.out.println("capacity: "+byteBuffer.capacity()); //1024

clear():清除缓冲区,数据依然存在。只是位置信息被初始化

1
2
3
4
byteBuffer.clear();
System.out.println("position: "+byteBuffer.position()); //0
System.out.println("limit: "+byteBuffer.limit()); //1024
System.out.println("capacity: "+byteBuffer.capacity()); //1024

mark():标记position的位置

1
2
3
4
byteBuffer.put("jerry".getBytes());
byteBuffer.mark(); //当position为5时,进行标记
byteBuffer.put("tom".getBytes());
System.out.println("position: "+byteBuffer.position()); //8

reset():恢复mark标记的position的位置

1
2
byteBuffer.reset();
System.out.println("position: "+byteBuffer.position()); //5
如果我的文章对您有所帮助,不妨打赏一杯豆浆以资鼓励(○` 3′○)