public class BufferDemo { public static void main(String[] args) { //创建一个IntBuffer, 大小为 5, 即可以存放5个int IntBuffer intBuffer = IntBuffer.allocate(5); for(int i = 0; i < intBuffer.capacity(); i++) { intBuffer.put(i); } intBuffer.flip(); while (intBuffer.hasRemaining()) { System.out.println(intBuffer.get()); } }}
我们来看看Buffer里到底发生了什么?
初始化的时候
put(添加数据)的时
上图可看见,我们循环put值的时候,Position一直在增加,也就是下一个要写的位置。
元素添加完的时候
flip()后,读之前的时候
flip()源码:
。
以上几个图,大家就应该明白了Buffer 缓冲区四个核心属性的变化。
Buffer以及子类ByteBuffer的常用方法介绍
public abstract class Buffer { //JDK1.4时,引入的api public final int capacity( )//返回此缓冲区的容量 public final int position( )//返回此缓冲区的位置 public final Buffer position (int newPositio)//设置此缓冲区的位置 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( );//告知此缓冲区是否为只读缓冲区 //JDK1.6时引入的api public abstract boolean hasArray();//告知此缓冲区是否具有可访问的底层实现数组 public abstract Object array();//返回此缓冲区的底层实现数组 public abstract int arrayOffset();//返回此缓冲区的底层实现数组中第一个缓冲区元素的偏移量 public abstract boolean isDirect();//告知此缓冲区是否为直接缓冲区}public abstract class ByteBuffer { //缓冲区创建相关api public static ByteBuffer allocateDirect(int capacity)//创建直接缓冲区 public static ByteBuffer allocate(int capacity)//设置缓冲区的初始容量 public static ByteBuffer wrap(byte[] array)//把一个数组放到缓冲区中使用 //构造初始化位置offset和上界length的缓冲区 public static ByteBuffer wrap(byte[] array,int offset, int length) //缓存区存取相关API public abstract byte get( );//从当前位置position上get,get之后,position会自动+1 public abstract byte get (int index);//从绝对位置get public abstract ByteBuffer put (byte b);//从当前位置上添加,put之后,position会自动+1 public abstract ByteBuffer put (int index, byte b);//从绝对位置上put }
ByteBuffer 支持类型化的put 和 get
ByteBuffer 支持特定类型化的put 和 get, put 放入的是什么数据类型,get就应该使用相应的数据类型来取出,否则可能有 BufferUnderflowException 异常
public class NIOByteBufferPutGet { public static void main(String[] args) { //创建一个Buffer ByteBuffer buffer = ByteBuffer.allocate(64); //类型化方式放入数据 buffer.putInt(88); buffer.putLong(6L); buffer.putChar('朱'); buffer.putShort((short) 11); //取出 buffer.flip(); System.out.println(buffer.getInt()); System.out.println(buffer.getLong()); System.out.println(buffer.getChar()); System.out.println(buffer.getShort()); }}