9.NIO 核心1:缓冲区(Buffer)
static xxxBuffer allocate(int capacity):创建一个容量为capacity 的xxxBuffer对象
样例:
@Test
public void test01() {
//1.分配一个缓冲区,容量设置为10
ByteBuffer buffer = ByteBuffer.allocate(10);
//返回当缓冲区的当前位置
System.out.println(buffer.position());//0
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//10
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
System.out.println("=================================");
//2.往缓冲区中放数据
String name = "wumengda";
buffer.put(name.getBytes());
//返回当缓冲区的当前位置
System.out.println(buffer.position());//8
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//10
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
System.out.println("=================================");
//3.Buffer flip() 将缓冲区的界限设置为当前位置,并将当前位置设置为0:可读模式
buffer.flip();
//返回当缓冲区的当前位置
System.out.println(buffer.position());//0
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//8
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
//4.get数据获取
char ch= (char) buffer.get();
System.out.println(ch);//w
//返回当缓冲区的当前位置
System.out.println(buffer.position());//1
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//8
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
}
样例2:clear的使用
@Test
public void test02() {
ByteBuffer buffer = ByteBuffer.allocate(10);
String name = "wumengda";
buffer.put(name.getBytes());
//返回当缓冲区的当前位置
System.out.println(buffer.position());//8
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//10
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
System.out.println("=================================");
buffer.flip();
byte[] b = new byte[2];
buffer.get(b);
System.out.println(new String(b));//wu
//返回当缓冲区的当前位置
System.out.println(buffer.position());//2
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//8
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
System.out.println("=================================");
//重点1:clear 清空缓冲区,发现并不是真的清空,是将position置为0,limit和capacity置为最大,此时如果再放值,会进行覆盖
buffer.clear();
//返回当缓冲区的当前位置
System.out.println(buffer.position());//0
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//10
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
char ch = (char) buffer.get();
System.out.println(ch);//w
//返回当缓冲区的当前位置
System.out.println(buffer.position());//1
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//10
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
}
样例3:mark和resert的使用(标记和重置)
@Test
public void test02() {
ByteBuffer buffer = ByteBuffer.allocate(10);
String name = "wumengda";
buffer.put(name.getBytes());
//返回当缓冲区的当前位置
System.out.println(buffer.position());//8
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//10
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
System.out.println("=================================");
buffer.flip();
byte[] b = new byte[2];
buffer.get(b);
System.out.println(new String(b));//wu
//返回当缓冲区的当前位置
System.out.println(buffer.position());//2
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//8
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
System.out.println("=================================");
//重点:标记当前位置,后面可以resert
buffer.mark();
byte[] by = new byte[3];
buffer.get(by);
System.out.println(new String(by));//men
//返回当缓冲区的当前位置
System.out.println(buffer.position());//5
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//8
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
System.out.println("=================================");
buffer.reset();
if (buffer.hasRemaining()){
System.out.println("buffer剩余:"+buffer.remaining());//6
}
//返回当缓冲区的当前位置
System.out.println(buffer.position());//2
//返回缓冲区的limit界限位置
System.out.println(buffer.limit());//8
//返回缓冲区的容量
System.out.println(buffer.capacity());//10
}
直接内存的使用场景:
1.有很大的数据需要存储,他的生命周期又很长
2.适合频繁操作的io操作,比如网络并发场景
@Test
public void test3(){
ByteBuffer buffer=ByteBuffer.allocate(1024);
//判断是不是直接内存
System.out.println(buffer.isDirect());//false
//创建直接内存
ByteBuffer byteBuffer=ByteBuffer.allocateDirect(1024);
System.out.println(byteBuffer.isDirect());//true
}