1.IO与传统NIO的区别
传统IO是一次一个字节地处理数据,NIO是以(缓冲区)形式处理数据。最主要的是NIO可以实现非阻塞,传统IO只能是阻塞的。
Java NIO使我们可以进行非阻塞IO操作。比如说,单线程中从通道读取数据到buffer,同时可以继续做别的事情,当数据读取到buffer中后,线程再继续处理数据。写数据也是一样的。另外,非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。
Java IO的各种流是阻塞的。这意味着,当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了
服务端与客户端的传输 NIO的优点就非常明显了 比如socket
2.NIO组成
NIO有三个核心部分
buffer 是存储数据的地方
在NIO厍中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作
Channel是运输数据的载体
通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。
Selector用于监控多个Channel的状态
选择器用于使用单个线程处理多个通道
3.NIO 读数据和写数据方式
通常来说NIO中的所有IO都是从 Channel(通道) 开始的。
从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。
从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。
补充·········
IO复用模型
通过一个进程监听多个文件描述符,一旦某个文件描述符准备就绪,就会通知程序做相应的处理。
优点体现在一个进程就能处理更多的连接。