Java IO/NIO的基本概念学习
Posted adventure.Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO/NIO的基本概念学习相关的知识,希望对你有一定的参考价值。
一、IO模型
- 阻塞IO模型
最传统的IO模型,即在读写数据过程中会发生阻塞现象
(可以理解为等待)。
当用户线程发出IO请求之后,内核
会去查看数据是否就绪,若为就绪,用户线程则处于阻塞状态,并交出CPU
。当数据就绪,内核则将数据拷贝到用户线程,并返回结构给用户线程,用户线程解除block状态
(即阻塞状态)。
例:data = socket.read();若数据没有就绪,则一直阻塞在read()方法。
- 非阻塞IO模型
当用户线程发起一个读写操作后,并不需要等待,而是马上得到一个结果
。若结果返回一个error是,则代表数据还未准备好,于是它可以再次发送该操作,一旦内核准备好数据,并且用户线程请求,则马上将数据拷贝
到用户线程,然后返回。但在此情况下,用户线程需要不断询问内核数据是否就绪(轮询频率?),也就是不会交出CPU,一直占用。
- 多路复用IO模型
多路复用IO模型是当前使用比较多的模型。Java NIO 就是该模型。
原理:有一个线程不断去轮询多个socket(程序通信的端点抽象),只有当socket真正的读写事件是,才真正调用实际的IO读写操作
。 多路复用IO模型,只需要一个线程就可以管理多个socket,系统无需再建立新的线程,只有当socket真正的读写时,才会使用IO资源,因此大大减少了资源占用。(Java NIO中使用selector.select()去查询是否有达到事件)。
Socket就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象)的。
多路复用IO模型效率高于非阻塞IO,是因为非阻塞IO不断询问socket状态是通过用户线程去进行的,而多路复用是内核中进行的。
Java NIO模型
Java BIO、AIO、NIO
- 信号驱动IO模型
当用户线程发起IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪是就会发送一个信号给用户线程,用户线程收到信号之后,便在信号函数中调用IO函数
进行读写操作。
- 异步IO模型
最理想的IO模型,用户线程发起IO请求,当结束内核返回的成功信号是表示IO操作已完成,可以直接去使用数据
(无需用户线程再调用IO函数,主要交给内核去实现了,需要OS的底层实现)。
二、Java IO包
JAVA NIO
NIO:主要有三个核心部分:channel,buffer,selector.传统IO基于字节流和字符流操作,NIO基于channel和buffer操作。单线程监听多个数据通道。
(1)channel(通道)
和IO中的Stream差不多,只不过Stream为单向,channel为双向,即可读也可写。
1.FileChannel(对应IO)
2.DatagramChannel(对应UDP)
3.SocketChannel(对应TCP的Client)
4.ServerSocketChannel(对应TCP的Server)
(2)Buffer(缓冲区)
缓冲区,实际上就是一个容器,一个连续的数组。Channel提供从文件、网络读取数据的通道,但是读取和写入数据必须经由Buffer
。也就是client写数据给server时,先写到buffer,再由buffer到channel.接收方如此。
(3)Selector
NIO的核心类,能够检测
多个注册的通道上是否有事件发生,若有则获取事件并针对每个事件进行相应的响应处理。
关于NIO的实例
使用NIO进行Socket通信
以上是关于Java IO/NIO的基本概念学习的主要内容,如果未能解决你的问题,请参考以下文章