阻塞IO,读写过程中存在阻塞,用户线程交出CPU
非阻塞IO,读写过程中不存在阻塞,用户线程不交出CPU
多路复用IO模型,存在一个线程不断轮询多个socket状态,当socket有真正读写事件时,才执行真正的IO。Java的NIO就是多路复用IO模型,Selector.selcet()查询每个通道是否有事件到达,有则执行相应的事件体
异步IO模型,最理想的IO模型,用户线程不需要知道IO怎么进行,当发出请求后,待内核完成数据准备,发信号给用户线程,用户线程收到信号就可以直接使用数据,该模式需要底层系统支持,Java7提供Asynchronous IO
JavaIO包,有字节流(InputStream、OutStream)与字符流(Reader、Writer)
JavaNIO包,有Channel、Buffer、Selector
Channel,通道,有FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel
Buffer,缓冲区,也就是连续的数组,与Channel交互,数据总是从Channel写到缓冲区,从缓冲区读到Channel
Selector,选择区,NIO的核心类,监听多个通道的事件,单一线程管理多个连接,避免上下文切换开销,有读写事件才调用真正的IO
NIO与IO对比:
一个是面向缓冲区,一个是面向流
NIO读取数据可以前后移动,IO流不能前后移动
一个是非阻塞的,一个是阻塞的