NIO与IO
- io和nio都可以用来处理数据传输,底层实现及效率方面有所不同
区别
- io是阻塞方式,nio是非阻塞方式
- io是一种传统的数据阻塞传输方式,也就是说,在传输多个文件时,只能依次读写,只有一个任务执行完成,下一个任务才可以开始
- nio是非阻塞的数据传输方式,会将数据直接读到缓冲区,然后从缓冲区获取数据,采用的是一种预读的方式,而且会使用多个channel进行数据读取,在没有读取完成时,程序会继续执行,如果读取数据完成,则会通知程序,处理当前数据
- io是面向流,nio是面向块,也就是面向buffer
- io传输方式是:按照字节传输,一次只处理一个字节的数据
- nio传输方式是:将数据预读到buffer缓冲区中,使用的时候直接去缓冲区拿
nio组件
- buffer:用来存储数据的缓冲区,在读取数据时,会将数据临时存储在缓冲区,缺点是,必须保证缓冲区数据的完整性,如果读取数据不完成,则缓冲区中的数据就不完整,导致write的时候数据丢失
在io中包装流也有buffer的存在,但在io中,是通过流读取到缓冲区中,而nio是直接读取到缓冲区中
- channel:读取数据的管道,每条数据都必须通过管道读取到缓冲区,类似io中的stream,除了fileChannel之外,其他channel都能以非阻塞方式执行
- selector:用来处理不同管道的执行,包装channel处于非阻塞的状态,合理利用channel资源
ps:
1. 如果处理较大文件,文件数量较少时,使用io效率要高于nio,因为io是一种直连接,而且不需要多次创建和打开连接
2. nio适合数量较多,数据较少的场景,例如聊天室这种数据较少,需要多次连接的情况