Buffer缓冲区是就是一个数组,有着不一样的数据类型:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer,而后这些数据类型均可以经过 allocate() 获取缓冲区。数组
static XxxBuffer allocate(int capacity) : 建立一个容量为 capacity 的 XxxBuffer 对象,以下:测试
//1. 分配一个指定大小的Byte类型的缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
put() : 存入数据到缓冲区中spa
put(byte b) | 将给定单个字节写入缓冲区的当前位置 |
put(byte[] src)对象 |
将 src 中的字节写入缓冲区的当前位置blog |
put(int index, byte b)索引 |
将指定字节写入缓冲区的索引位置(不会移动 position)ip |
get() : 获取缓冲区中的数据内存
get()ci |
读取单个字节rem |
get(byte[] dst) |
批量读取多个字节到 dst 中 |
get(int index) |
读取指定索引位置的字节(不会移动 position) |
byteBuffer.put(“Mujiutian”);
byteBuffer.get();
0 <= mark <= position <= limit <= capacity
capacity : 容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。
byteBuffer.capacity()
limit : 界限,表示缓冲区中能够操做数据的大小。(limit 后数据不能进行读写)
byteBuffer.limit()
position : 位置,表示缓冲区中正在操做数据的位置。
byteBuffer.position()
mark : 标记,表示记录当前 position 的位置。能够经过 reset() 恢复到 mark 的位置
byteBuffer.mark()
非直接缓冲区:经过 allocate() 方法分配缓冲区,将缓冲区创建在 JVM 的内存中
直接缓冲区:经过 allocateDirect() 方法分配直接缓冲区,将缓冲区创建在物理内存中。能够提升效率
@Test public void test1(){ String str = "MuJiuTian"; //1. 分配一个指定大小的Byte类型的缓冲区 ByteBuffer buf = ByteBuffer.allocate(1024); System.out.println("-----------------allocate()----------------"); //此时缓冲区为读,下标位置 System.out.println(buf.position()); //此时缓冲区的界线,也就是临界点,1024 System.out.println(buf.limit()); //缓冲区的容量 System.out.println(buf.capacity()); //2. 利用 put() 存入数据到缓冲区中 buf.put(str.getBytes()); System.out.println("-----------------put()----------------"); //此时缓冲区为读,下标位置已经读到第五个了 System.out.println(buf.position()); System.out.println(buf.limit()); System.out.println(buf.capacity()); //3. 切换读取数据模式,切换为写的模式,也就是把刚刚读取的内容从新从下标0开始读 buf.flip(); System.out.println("-----------------flip()----------------"); System.out.println(buf.position()); System.out.println(buf.limit()); System.out.println(buf.capacity()); //4. 利用 get() 读取缓冲区中的数据 byte[] dst = new byte[buf.limit()]; buf.get(dst); System.out.println(new String(dst, 0, dst.length)); System.out.println("-----------------get()----------------"); System.out.println(buf.position()); System.out.println(buf.limit()); System.out.println(buf.capacity()); //5. rewind() : 可重复读 buf.rewind(); System.out.println("-----------------rewind()----------------"); System.out.println(buf.position()); System.out.println(buf.limit()); System.out.println(buf.capacity()); //6. clear() : 清空缓冲区. 可是缓冲区中的数据依然存在,可是处于“被遗忘”状态 buf.clear(); System.out.println("-----------------clear()----------------"); System.out.println(buf.position()); System.out.println(buf.limit()); System.out.println(buf.capacity()); System.out.println((char)buf.get()); }
结果:
看刚刚的流程图:
@Test public void test2(){ String str = "Mujiutian"; //建立Byte类型缓冲区 ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //此时为读模式,读取str内容 byteBuffer.put(str.getBytes()); //切换为写的模式,处理刚刚读取的内容 byteBuffer.flip(); //此时limit为9,由于读取了Mujiutian 9个字节 byte[] dst = new byte[byteBuffer.limit()]; //读取下标0到2的字节 byteBuffer.get(dst, 0, 2); System.out.println(new String(dst, 0, 2)); System.out.println(byteBuffer.position()); //mark() : 标记 byteBuffer.mark(); byteBuffer.get(dst, 2, 2); System.out.println(new String(dst, 2, 2)); System.out.println(byteBuffer.position()); //reset() : 使用该方法,位置恢复到 mark 的位置 byteBuffer.reset(); System.out.println(byteBuffer.position()); //判断缓冲区中是否还有剩余数据 if(byteBuffer.hasRemaining()){ //获取缓冲区中能够操做的数量 System.out.println(byteBuffer.remaining()); } }
结果为:
@Test public void test3(){ //分配直接缓冲区 ByteBuffer buf = ByteBuffer.allocateDirect(1024); System.out.println(buf.isDirect()); }
结果:true