缓冲区(Buffer):一个用于特定基本数据类型的容器。由java.nio包定义的,所有缓冲区都是Buffer抽象类的子类
- 缓冲区的类型:
缓冲区(Buffer):在Java NIO中负责数据的存取。缓冲区就是数组,用于存储不同类型的数据,根据类型的不同(除boolean),都提供了相应类型的缓冲区:
ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer
缓冲区的管理方式基本一致,都是通过allocate()来获取
- 缓冲区存取数据的两个核心方法:
- put():存入数据到缓冲区
- get():获取缓冲区中的数据
- 缓冲区中的四个核心属性
- capacity:容量,标识缓冲区中最大存储数据的容量,声明后不能更改
- limit:接线,标识缓冲区中可以操作数据的大小,limit后的数据不能进行读写操作
- position:位置,表示缓冲区中正在操作数据的位置
- mark:标记,表示记录当前position的位置,可以通过reset()恢复到mark的位置

这些属性之间的大小遵循的顺序:
0 <= mark <= position <= limit <=capacity
public class BufferDemo {public static void demo1() {String str = "abcde";// 分配一个指定大小的缓冲区ByteBuffer byteBuffer = ByteBuffer.allocate(1024);System.out.println("---------allocate-----------");System.out.println(byteBuffer.capacity()); // 1024System.out.println(byteBuffer.limit()); // 1024System.out.println(byteBuffer.position()); // 0// 利用 put() 存入数据到缓冲区中byteBuffer.put(str.getBytes());System.out.println("---------put-----------");System.out.println(byteBuffer.capacity()); // 1024System.out.println(byteBuffer.limit()); // 1024System.out.println(byteBuffer.position()); // 5// 切换到读数据模式byteBuffer.flip();System.out.println("---------flip-----------");System.out.println(byteBuffer.capacity()); // 1024System.out.println(byteBuffer.limit()); // 5,limit 表示可以操作数据的大小,只有 5 个字节的数据给你读,所以可操作数据大小是 5System.out.println(byteBuffer.position()); // 0,读数据要从第 0 个位置开始读// 利用 get() 读取缓冲区中的数据byte[] dst = new byte[byteBuffer.limit()];byteBuffer.get(dst);System.out.println(new String(dst, 0, dst.length));System.out.println("---------get-----------");System.out.println(byteBuffer.capacity()); // 1024System.out.println(byteBuffer.limit()); // 5,可以读取数据的大小依然是 5 个System.out.println(byteBuffer.position()); // 5,读完之后位置变到了第 5 个// rewind() 可重复读byteBuffer.rewind(); // 这个方法调用完后,又变成了读模式System.out.println("---------rewind-----------");System.out.println(byteBuffer.capacity()); // 1024System.out.println(byteBuffer.limit()); // 5System.out.println(byteBuffer.position()); // 0// clear()// 清空缓冲区,虽然缓冲区被清空了,但是缓冲区中的数据依然存在,只是出于"被遗忘"状态。意思其实是,缓冲区中的界限、位置等信息都被置为最初的状态了,所以你无法再根据这些信息找到原来的数据了,原来数据就出于"被遗忘"状态byteBuffer.clear();System.out.println("---------clear-----------");System.out.println(byteBuffer.capacity()); // 1024System.out.println(byteBuffer.limit()); // 1024System.out.println(byteBuffer.position()); // 0}public static void demo2() {String str = "abcde";ByteBuffer byteBuffer = ByteBuffer.allocate(1024);byteBuffer.put(str.getBytes());byteBuffer.flip();byte[] bytearray = new byte[byteBuffer.limit()];byteBuffer.get(bytearray, 0, 2);System.out.println(new String(bytearray, 0, 2)); // 结果是 abSystem.out.println(byteBuffer.position()); // 结果是 2// 标记一下当前 position 的位置byteBuffer.mark();byteBuffer.get(bytearray, 2, 2);System.out.println(new String(bytearray, 2, 2));System.out.println(byteBuffer.position()); // 结果是 4// reset() 恢复到 mark 的位置byteBuffer.reset();System.out.println(byteBuffer.position()); // 结果是 2// 判断缓冲区中是否还有剩余数据if (byteBuffer.hasRemaining()) {// 获取缓冲区中可以操作的数量System.out.println(byteBuffer.remaining()); // 结果是 3,上面 position 是从 2 开始的}}}
