目录
Buffer介绍
1.Buffer简介
缓冲区(Buffer)是中NIO中基础的内容,存在于包java.nio下面.一个Buffer对象可以看做是一个存储数据的容器,数据被存储到这里后可以进行检索。缓冲区工作与通道关联,我们不与通道直接进行交互,而是通过缓冲区将数据传送到通道里,或者从通道获取数据放到缓冲区。Buffer类是一个顶层的抽象类,里面定义了缓冲区操作的基本方法。Buffer的子类包含了java基本类型中除布尔类型以外的其他基本数据类型对应缓冲区。需要注意的是数据传输的基本单位是字节,所以唯一与通道交互的缓冲区是ByteBuffer,存储的是原始的字节数据,而其他的缓冲区提供了用java基本数据类型来查看ByteBuffer中字节数据的视图,比如调用asCharBuffer(),就是将字节转换成字符查看ByteBuffer里面的数据,实际存储数据的真正地方依旧是ByteBuffer缓冲区。
ByteBuffer是原始字节存储的地方,如要将字节进行正确转换成字符数据,需要将字节数据先进行特定编码转成字符输入到字符缓冲区,或者在输出的时候将数据按指定字符集进行解码处理,否则会出现乱码的情况。
java.nio包下面包含java基本类型中除boolean类型的缓冲区有ByteBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,CharBuffer
DoubleBuffer,此外还有MappedByteBuffer(继承自ByteBuffer),还有不能直接访问的HeapByteBuffer,DirectByteBuffer。其中HeapByteBuffer是调用ByteBuffer中allocate()时底层的实现,分配空间是受JVM管控的堆内存。而DirectByteBuffer是ByteBuffer.allocateDirect()方法时底层实现,分配的空间是虚拟机之外的内存。Buffer的子类子类如下:
基本数据类型 | 缓冲区 |
---|---|
byte | ByteBuffer |
short | ShortBuffer |
int | IntBuffer |
long | LongBuffer |
boolean | - |
char | CharBuffer |
float | FloatBuffer |
double | DoubleBuffer |
- | MappedByteBuffer |
- | HeapByteBuffer(底层实现,无法直接访问,JVM堆内存) |
- | DirectByteBuffer(底层实现,无法直接访问,JVM外的内存) |
2.内部变量
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
long address;
- mark----调用mark()方法将会当前位置postion保存,-1表示的是当前没有标记。
- position----下一个要写入或者读取元素的索引位置,position值不会为负数,并且不会大于limit的值。
- limit----第一个不能写入或者读取的元素的索引位置,limit值不会为负数,并且不会大于capacity的值。
- capacity----缓冲区的容量,capacity值不会为负数,并且不能被改变。
所以Buffer变量内部变量满足:0 <= mark<=position <= limit <= capacity.
2.内部方法
public final int capacity() {}
public final int position() {}
public final Buffer position(int newPosition) {}
public final int limit() {}
public final Buffer limit(int newLimit) {}
public final Buffer mark() {}
public final Buffer reset() {}
public final Buffer clear() {}
public final Buffer flip() {}
public final Buffer rewind() {}
public final int remaining() {}
public final boolean hasRemaining() {}
public abstract boolean isReadOnly()
public abstract boolean hasArray();
public abstract Object array();
public abstract int arrayOffset();
public abstract boolean isDirect()