版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueloveme/article/details/84987990
大家推荐个靠谱的公众号程序员探索之路,大家一起加油
package com.zzh.buffer;
import org.junit.jupiter.api.Test;
import java.nio.ByteBuffer;
/**
* 一.缓冲区(buffer):在java nio中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据
* 根据数据类型不同(boolean除外),提供了相应类型的缓冲区:
*ByteBuffer
* CharBuffer
* ShortBuffer
* IntBuffer
* LongBuffer
* FloatBuffer
* DoubleBuffer
* 上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区
*
* 二 缓冲区中的四个核心方法:
* put() : 存入数据到缓冲区中
* get(): 获取缓冲区中的数据
* flip():切换到读数据模式
* rewind():重新读(注意和flip的区别)
* clear():清空,缓冲区中的数据依然存在,但是处于"被遗忘状态"
*
* 三.缓冲区的四个核心属性:
* private int mark = -1; //标记,表示记录当前postion的位置,可以通过reset()恢复到mark的位置
private int position = 0;//当前位置
private int limit;//可读取的最大位置
private int capacity;//容量,表示缓冲区中最大存储数据的容量.一旦声明
*四,直接缓冲区与非直接缓冲区
* 非直接缓冲区:通过allocate方法分配缓冲区,将缓冲区建立在JVM的内存中
* 直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中,某些环境下可以直接提高效率
*/
public class TestBuffer {
public static void main(String[] args) {
String name = "zzh";
//1.分配一个容量为1024的缓存区
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
System.out.println("分配容量之后的缓冲区--------------");
System.out.println("position->"+byteBuffer.position());
System.out.println("limit->"+byteBuffer.limit());
System.out.println("capacity->"+byteBuffer.capacity());
//2.存入数据
byteBuffer.put(name.getBytes());
System.out.println("存入数据之后的缓冲区--------------");
System.out.println("position->"+byteBuffer.position());
System.out.println("limit->"+byteBuffer.limit());
System.out.println("capacity->"+byteBuffer.capacity());
/**
* 3.切换到读取数据模式
* 作用
* limit = position; 可访问的位置=position
position = 0; 将postion 置为0
mark = -1;
*/
byteBuffer.flip();
System.out.println("切换到读取数据模式后的缓冲区--------------");
System.out.println("position->"+byteBuffer.position());
System.out.println("limit->"+byteBuffer.limit());
System.out.println("capacity->"+byteBuffer.capacity());
/**
* 4.读取数据
*/
byte[] bytes = new byte[byteBuffer.limit()];
byteBuffer.get(bytes);
System.out.println(new String(bytes, 0, bytes.length));
System.out.println("读取数据后的缓冲区--------------");
System.out.println("position->"+byteBuffer.position());
System.out.println("limit->"+byteBuffer.limit());
System.out.println("capacity->"+byteBuffer.capacity());
/**
* 5.rewind 注意和flip的区别
* 作用
* position = 0;
mark = -1;
*/
byteBuffer.rewind();
System.out.println("rewind后的缓冲区--------------");
System.out.println("position->"+byteBuffer.position());
System.out.println("limit->"+byteBuffer.limit());
System.out.println("capacity->"+byteBuffer.capacity());
/**
* clear(),清空缓冲区,只是四个核心属性被初始化,缓冲区中的数据依然存在,但是处于"被遗忘状态"
*/
byteBuffer.clear();
System.out.println("清空缓冲区后的缓冲区--------------");
System.out.println("position->"+byteBuffer.position());
System.out.println("limit->"+byteBuffer.limit());
System.out.println("capacity->"+byteBuffer.capacity());
/**
* mark()标记一下 postion的位置
*/
byteBuffer.mark();
/**
* reset()恢复到mark标记的位置
*/
byteBuffer.reset();
/**
* hasRemaining缓冲区中是否有数据
*/
byteBuffer.hasRemaining();
/**
* 缓冲区中剩余多少数据
*/
int remaining = byteBuffer.remaining();
}
@Test
public void bufferDirect(){
//直接缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
}
}