PS: 之前一直想了解这个NIO到底是什么东西,奈何目前用不到,听说现在许多框架都在用,而且面试的时候也有被问道,感觉还是去多了解了解底层怎么实现的~~这是我的第100篇博客!!!
一. NIO与IO区别
NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector
二. 缓冲区
缓冲区(Buffer) :一个用于特定基本数据类型的容器。由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类。
Java NIO 中的 Buffer 主要用于与 NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。
2.1 直接缓冲区与非直接缓冲区
- 非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM的内存中
- 直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率
这里探究验证了一下底层Buffer的原理
//分配指定大小的缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
String s=new String("abcde");
//缓冲区存数据
System.out.println("PUT操作");
byteBuffer.put(s.getBytes());
System.out.println(byteBuffer.position()); //5
System.out.println(byteBuffer.limit()); //1024
System.out.println(byteBuffer.capacity()); //1024
System.out.println("***************************");
System.out.println("filp操作");
byteBuffer.flip();
System.out.println(byteBuffer.position()); //0
System.out.println(byteBuffer.limit()); //5
System.out.println(byteBuffer.capacity()); //1024
System.out.println("***************************");
System.out.println("get操作");
byte[] b=new byte[byteBuffer.limit()];
byteBuffer.get(b,0,4);
if(byteBuffer.hasRemaining()){
//判断缓冲区是否有剩余
System.out.println("缓冲区还有几个剩余的: "+byteBuffer.remaining());
}
System.out.println(byteBuffer.position()); //5
System.out.println(byteBuffer.limit()); //5
System.out.println(byteBuffer.capacity()); //1024
System.out.println("***************************");
System.out.println("rwind操作可重复读"); //又把position置于开头
byteBuffer.rewind();
System.out.println(byteBuffer.position()); //0
System.out.println(byteBuffer.limit()); //5
System.out.println(byteBuffer.capacity()); //1024
System.out.println("***************************");
System.out.println("mark操作记录当前的position位置"); //又把position置于开头
byteBuffer.mark();
byte[] bytes=new byte[1024];
byteBuffer.get(bytes,0,2); //取走前两个,position为2
System.out.println("取走前两个,position为"+byteBuffer.position()); //2
byteBuffer.reset(); //恢复到mark位置的position 为0
System.out.println("恢复到mark位置的position 为"+byteBuffer.position()); //0
System.out.println("***************************");
System.out.println("clear操作清空(非真清空,相当于把position和limit恢复开始状态)数组中的数据依然存在"); //又把position置于开头
byteBuffer.clear();
System.out.println(byteBuffer.position()); //0
System.out.println(byteBuffer.limit()); //1024
System.out.println(byteBuffer.capacity()); //1024
System.out.println("***************************");
//获取第一个bytez转化为char还是能输出
System.out.println("获取第一个bytez转化为char还是能输出"+(char)byteBuffer.