1、缓冲区(Buffer)
在NIO中负责数据的存取。缓冲区就是数组,用于存储不同数据类型的数据,根据数据类型不同(boolean除外),提供了相应类型的缓冲区:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。
①管理方式基本一致,通过allocate()获取缓冲区
ByteBuffer buf = ByteBuffer.allocate(512);
②缓冲区存取数据的方法:
put():存入数据到缓冲区
get():获取缓冲区中的数据
③缓冲区四个核心属性
capacity:容量,缓冲区中最大的存储容量,一旦声明不能改变。
limit:界限,缓冲区中可以操作数据的大小,(limit后的数据不能读写)
position:位置,缓冲区中正在操作的位置
mark:标记,表示记录当前position的位置。可以通过reset()恢复到mark的位置
mark <= position <= limit <= capacity
测试代码:
String str = "12345";
ByteBuffer buf = ByteBuffer.allocate(512);//分配制定大小的缓冲区
System.out.println(buf.position());//0
System.out.println(buf.limit());//512
System.out.println(buf.capacity());//512
buf.put(str.getBytes());//将数据放入缓冲区
System.out.println(buf.position());//5
System.out.println(buf.limit());//512
System.out.println(buf.capacity());//512
buf.flip();//切换成读取数据模式
System.out.println(buf.position());//0
System.out.println(buf.limit());//5
System.out.println(buf.capacity());//512
byte[] des = new byte[buf.limit()];
buf.get(des);//读取缓冲区数据
System.out.println(new String(des,0,des.length));//12345
System.out.println(buf.position());//5
System.out.println(buf.limit());//5
System.out.println(buf.capacity());//512
buf.rewind();//可重复读
System.out.println(buf.position());//0
System.out.println(buf.limit());//5
System.out.println(buf.capacity());//512
buf.clear();//清空缓冲区,但是缓冲区的数据依然存在,处于“被遗忘”状态
System.out.println(buf.position());//0
System.out.println(buf.limit());//512
System.out.println(buf.capacity());//512
System.out.println((char) buf.get());//1 说明数据依然存在