1、主要区别:
io是面向流、阻塞的。 Nio是面向缓存、非阻塞的。
传统IO基于字节流和字符流进行操作。
NIO基于Channel(通道)、Buffer(缓冲区)进行操作,数据从通道读取到缓冲区中,或者从缓冲区读取到通道中。
NIO中使用Selector(选择区)监听多个Channel(通道)事件,因此单个线程可以监听多个数据通道。(比如:连接打开,数据到达)
2、IO 工作流程:
由于Java IO是阻塞的,所以当面对多个流的读写时需要多个线程处理。例如在网络IO中,Server端使用一个线程监听一个端口,一旦某个连接被accept,创建新的线程来处理新建立的连接。其中 read/write 是阻塞的。
3、NIO 工作流程:
NIO 提供 Selector 实现单个线程管理多个channel的功能。select 调用可能是阻塞的,也可以是非阻塞的。但是read/write是非阻塞的!
4、NIO为什么会被阻塞:
//这个方法可能会阻塞,直到有一个已注册的事件发生,或者当一个或者更多的事件发生时 //可以设置超时时间,防止进程阻塞 selector.select(long timeout); //使用此方法可以防止阻塞,阻塞在select()方法上的线程也可以立刻返回,不阻塞 selector.selectNow(); //可以唤醒阻塞状态下的selector selector.wakeup();
5、BIO、NIO、AIO 有什么区别:
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方 便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道) 通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的 操作基于事件和回调机制。