任何事物的发展都是由不完善到更好的方向发展的,至于能不能发展到完善,我这里可以负责任的说:是不能的,因为随着时代的发展,任何过去时的研究成功不能总满足当下或将来的状况。这就像我们码农的 命运一样,昨天我们学习了Struts、hibernate等技术,几年后被Spring mvc、mybatis取代的时候,我们还要赶紧学习这些框架,谁也不知道明天会不会有个新的框架出来再取而代之。只有不断学习才不会被这个时代抛弃。
IO的发展也类似,起初(jdk1.4之前)IO提供了字节流和字符流,但设计都是线程阻塞的,效率非常低下,jdk1.4开始对IO进行了改革,推出了同步非阻塞IO, 提供了 Channel、Selector、Buffer新的抽象,读写效率得到了提高。2011年,jdk1.7发布,AIO的出现,标志着IO的操作又进入一个新阶段。
BIO(Blocking I/O):同步阻塞IO模式,数据读取或写入必须阻塞在一个线程内完成。 【以下摘自知乎:在此种方式下,用户进程在发起一个 IO 操作以后,必须等待 IO 操作的完成,只有当真正完成了 IO 操作以后,用户进程才能运行。 】
NIO(New I/O):支持同步阻塞和非阻塞IO模式。同步非阻塞:【以下摘自知乎: 在此种方式下,用户进程发起一个 IO 操作以后 边可 返回做其它事情,但是用户进程需要时不时的询问 IO 操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的 CPU 资源浪费。 】
AIO( Asynchronous I/O ): 异步非阻塞I/O模型(知乎中有人说java实现的不是异步非阻塞,而是异步阻塞,这里需要进一步考证)。 异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会阻塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
由于今天时间的问题,先整理这部分内容。后序会用实例说明每一种模式的操作方式。