一、缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据
根据数据类型不同(boolean 除外),提供了相应类型的缓冲区: ByteBuffer、 CharBuffer、ShortBuffer、 IntBuffer、 LongBuffer、FloatBuffer、 DoubleBuffer
上述缓冲区的管理方式几乎一致,通过 allocate() 获取缓冲区,如 ByteBuffer.allocate(1024);
二、 缓冲区存取数据 核心方法 put() 存入数据到缓冲区中 ;get() 获取缓冲区中的数据
三、缓冲区的核心属性:
capatity 容量 缓冲区最大存储数据容量,一旦声明不能改变 ;
limit:界限,表示缓冲区可以操作数据的大小(limit后数据不能进行读写)
position 位置,表示缓冲区正在操作数据的位置
mark :标记 表示记录当前 position 的位置。可以通过 reset() 恢复到 mark 的位置
四、直接缓冲区与非直接缓冲区:
非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中
直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率
代码实例
public void test1(){
String str="abcde";
//分配指定大小的缓冲区
ByteBuffer buf=ByteBuffer.allocate(1024);
System.out.println("");
//存数据
buf.put(str.getBytes());
System.out.println("put");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//切换读数据模式
buf.flip();
//利用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());
//rewind 可重复读
buf.rewind();
System.out.println("rewind");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//clear 清空缓冲区,但是缓冲区数据依然存在
buf.clear();
System.out.println("clear");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
}public void test2(){
String str="abcde";
ByteBuffer buf=ByteBuffer.allocate(1024);
buf.put(str.getBytes());
//切换读模式
buf.flip();
byte[] bst=new byte[buf.limit()];
buf.get(bst,0,2);
System.out.println(new String(bst,0,2));
System.out.println(buf.position());
//mark标记
buf.mark();
buf.get(bst,2,2);
System.out.println(new String(bst,2,2));
System.out.println(buf.position());
//reset :恢复到mark的位置
buf.reset();
System.out.println(buf.position());
}