NIO 基本介绍
前面我们看到了Bio,不讲武德,浪费资源。Nio要好很多,人家知道节约粮食。
1、从jdk 1.4开始,引入了Nio,Nio的N有人解释为New,也有人解释为 No - blocking,都对。它是一个同步非阻塞的。相对于Bio是一个新的io,也是一个非阻塞的io。
2. 一般都在包,java.nio下。
3. Nio的核心,通道,缓冲区,选择器。
4. 它是面向缓冲区编程的。
5. 为什么讲bio不讲武德,因为现在有50个请求过来了,bio是给50个线程去处理的。而nio可能1个线程搞定,当没有任务的时候,它啥也不干,但是有任务了,他就立马干,不会堵在那里,非要等。
完善一个nio的图
1、每一个通道都会对应一个缓冲区
2、一个选择器可以对应多个通道
3、切到哪个通道是由事件决定的
4、Buffer底层是数组
5、在Bio中,一个流只能干一件事,例如:读、写。没听过那个类可以又读又写。但是NIO只要一个反转,我本来在写,反转之后就可以读。
通道和缓存区是双向的!!!
通道和缓存区是双向的!!!
通道和缓存区是双向的!!!
注意!!!如果有箭头,就是双向箭头。
NIO和BIO对比
也看到了,BIO用流读取数据,而NIO用缓冲区读取,效率肯定高。
BIO阻塞的,NIO非阻塞
BIO基于字符流和字节流读取数据的,而NIO则是用通道和缓冲区配合的。从通道读取到缓冲区,从缓冲区可以写到通道。而选择器类似于一种监听器。所以能协调好。
Buffer缓冲区
Buffer初体验
public static void main(String[] args) {
// 指定空间
IntBuffer buffer = IntBuffer.allocate(10);
// 存放(写)数据
for (int i = 0; i < 10; i++) {
buffer.put(i * 3);
}
// 反转
buffer.flip();
// 拿取(读)数据
while (buffer.hasRemaining()){
System.out.println(buffer.get());
}
}
很简单,放几个读几个,但是得反转,不然读不了。
基本介绍
我们上一个点跑了一个demo,现在Buffer缓冲区隆重登场,介绍一下这个玩意。
这玩意其实就是我们内存中一个可以读可以写的一个内存块而已。这里面类似于我们的CHM,定义了一些指针啊,记录器啊之类的乱七八糟的。但是复杂程度远远不如CHM。CHM的源码我读了有5天才勉强知道他要干啥,太难了!!!吐槽一下。我们的通道,读写必须经过缓冲区!!!
Buffer有IntBuffer,LongBuffer等其中子类(最常用),除了没有布尔Buffer其他都有。其实我们都可以用ByteBuffer代替。
这四位大哥,是Buffer及其子类中最重要的四位。
分别是标记、位置、终点、容量。
重要的方法无非就这几个:
结束语
其实把Buffer领出来单讲没多少东西,无非就是一个能读能写的内存块。就是个数组。里面的几个指针,更简单了,我往里面放几个数。0 1 2 3 4 5 放完了,那终点不就是5 此时指针的位置在5,现在我要读了,反转一下,指针位置变成0,其他不变,然后一个个往前拨动指针,就这点东西。
再见再见再见再见再见