Buffer 基本介绍
Buffer 即缓冲区,本质上就是一个可以读写的内存块,可以理解成一个容器对象,该对象提供了一组方法,可以更轻松的使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、网络读取数据的渠道,但是读取或者写入数据都必须经过 Buffer。
Buffer 类结构
1、在 NIO 中,Buffer 是一个顶层父类,它是一个抽象类, 类的层级关系图
常用Buffer子类一览
ByteBuffer,存储字节数据到缓冲区
ShortBuffer,存储字符串数据到缓冲区
CharBuffer,存储字符数据到缓冲区
IntBuffer,存储整数数据到缓冲区
LongBuffer,存储长整型数据到缓冲区
DoubleBuffer,存储小数到缓冲区
FloatBuffer,存储小数到缓冲区
2、Buffer类定义了所有的缓冲区都具有的四个属性来提供关于其所包含的数据元素的信息
// 标记,书签。
private int mark = -1;
// 下一个要被读或者写的元素的索引,每次读写缓冲区都会修改该值。为下次读写做准备。
private int position = 0;
// 表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。其可以修改。
private int limit;
// 容量,即可以容纳最大的数据量;在缓冲区创建时被设定且不能改变。
private int capacity;
3、Buffer类相关方法一览
// 获取最大容量
public final int capacity();
// 获取当前的位置
public final int position();
// 设置当前的位置
public Buffer position(int newPosition);
// 返回极限值
public final int limit();
// 设置极限值
public Buffer limit(int newLimit);
// 清空缓冲区
public Buffer clear();
// 翻转缓冲区
public Buffer flip();
// 缓冲区中是否还有剩余元素
public final boolean hasRemaining();
// 该缓冲区是否是只读的
public abstract boolean isReadOnly();
// 该缓冲区是否有具有可访问的底层实现数组。
public abstract boolean hasArray();
// 返回此缓冲区的底层实现数组
public abstract Object array();
ByteBuffer
从前面可以看出对于 Java 中的基本数据类型(boolean除外),都有一个 Buffer 类型与之相对应,最常用的自然是ByteBuffer 类(二进制数据),该类的主要方法如下:
// 创建直接缓冲区
public static ByteBuffer allocate(int capacity);
// 创建直接缓冲区
public static ByteBuffer allocateDirect(int capacity);
// 获取当前位置的元素
public abstract byte get();
// 获取指定位置的元素
public abstract byte get(int index);
// 从当前位置添加元素
public abstract ByteBuffer put(byte b);
// 在指定位置放置元素
public abstract ByteBuffer put(int index, byte b);