简单理解IO

粗浅地理解IO

  写本文只是为了捋清楚java中IO的大概体系,不会涉及到具体用法。
  按照java发展历程,刚开始只是提供了简单的BIO。再后来,为了提供更加丰富的IO操作,java提供了新包nio,在我理解,NIOnew IO的缩写。众所周知,linux的五种IO模型分别是阻塞IO、非阻塞IO、IO复用、信号驱动和异步IO,如果以上述五种模型为基准,来对应nio包中各个io相关的类,可以发现java nio包中提供了非阻塞IO、IO复用、信号驱动和异步IO共四种类型的io。在linux中,这五种io模型是截然不同的,java io是对它们的一个包装。
  因此,从linux的角度来看,NIO读作new io。但是从java本身的角度来看,除了BIO,其它都是非阻塞的,所以又有人把NIO读作no block io。
  那么接着就引出一个问题,BIO中的stream和NIO中的channel怎么理解,有什么区别呢?本人窃以为,starem(流)代表了磁头一圈一圈地读磁盘,每读到一个字节就立即返回给上层。就像水管一样,硬盘代表流入的一端,应用程序代表流出的一端,什么时候流能够结束,完全取决于流入的一端,上层应用只能等待。
  而channel就代表了一个具体的IO媒介、与它相关的一系列操作,和缓冲区。应用程序来读取数据时,数据已经准备好,我们只需把数据写入到自己的buffer中即可。但是它是怎么读取的,读取的数据临时存放在哪里,如何与底层io交互,都已经封装在channel中了。同理,写入数据时只需把数据交给channel即可。
  听起来NIO只是简单地封装linux中的IO模型。但是一旦了解NIO的用法,就会发现,它整合了多方面的东西,提供了许多高级特性(比如selector、scatter/gather、socket channel等),甚至自成体系,用起来方便至极。这与spring 的IOC实现非常相似,围绕着反射这个核心,提供了一系列的高级容器,这样才使它能够算的上是一个成功的产品。
  以上是我对IO的粗浅理解,欢迎大家纠正。

附上一些资料供参考:
NIO用法
linux中的IO模型

猜你喜欢

转载自blog.csdn.net/qq_22421145/article/details/85274792