8.java NIO
1.简介
2.NIO和BIO的比较
1.BIO以流的方式处理数据,而NIO以块的放还是处理数据,块的I/O都效率比流的I/O高很多
2.BIO是阻塞的,NIO是非阻塞的
3.BIO基于字节流或者字符流进行操作,而NIO基于Channel(通道)和Buffer(缓存区)进行操作,数据总是从通道读取到缓冲区,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道事件(比如:连接请求,数据达到等)因此使用单个线程就可以监听多个客户端通道
NIO | BIO |
面向缓冲区(Buffer) | 面向流(Stream) |
非阻塞(Non Blocking IO) | 阻塞IO(Blocking IO) |
选择器(Selector) |
3.NIO三大核心原理
NIO有三大核心部分:Channel(通道) Buffer(缓冲区) Selector(选择器)
buffer缓冲区
缓冲区本质是一块可以写入数据,然乎可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用于方便的访问该块内存。相比较于对数组的操作,Buffer API更加容易操作和管理
Channel(通道)、
JAVA Nio的通道,类似于流,但又不同:既可以从通道中读取数据,又可以写数据到通道。但流的(input或者output)读写操作经常是单向额。通道可以非阻塞读取和写入通道,通道可以支持读取或者写入缓冲区,也支持异步读写
Selector选择器
Selector选择器是java NIO组件,可以能检查一个或者多个NIO通道,并确定哪些通道已经准备好进行读取或者写入。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接,提高效率
1.每个通道对应一个Buffer
2.一个线程对应selector,一个selector对应多个channel(连接)
3.程序切换到那个channel是由事件决定的
4.selector会根据余不同的事件,在各个通道上切换
5.Buffer是一个内存块,底层是一个数组
6.数据的读取写入是通过Buffer完成的,BIO中要么是输入流,或者输出流,不能双向,但是NIO的buffer是可以读也可以写
7.java NIO系统核心在于:通道和缓冲区。通道表示打开到IO设备(例如:文件、嵌套字)的连接。若需要使用NIO系统,需要获取用于连接IO设备的通道以及 用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理
总结:channel负责传输,Buffer负责存取数据