java中的I/O与NIO区别
一、I/O于NIO的基本概念:
I/O即普通I/O,是我们比较常用的一种形式,I/O又称阻塞IO。在默认情况下,文件操作都是阻塞IO。
当线程需要读取文件的时候,发现文件没有准备好,就会进入阻塞状态。数据准备好了之后,就会唤醒该线程,线程进
入等待状态,等待执行。轮到该进程执行的时候就会对数据进行读取。
当线程需要写文件的时候,先把数据通过IO驱动放在硬件的数据缓冲区,然后自己阻塞,等待写入文件到磁盘中。写入
完成之后,会唤醒该进程。进程进入等待状态等待执行。
NIO是非阻塞的IO,当进程需要读数据或者写数据的时候。并不会一直等待数据处理。而是一边等待一边处理其他东西。
比如一个进程要对文件进行读取操作。这时候进程会通过系统调用告诉硬件驱动我要读取文件,然后让硬件处理数据,
自己去做其他事情。然后进行轮询(执行一会就回来看看数据是否准备好),准备好了之后就对数据进行处理。
一个进程要对文件进行写操作,只需要把数据通过IO驱动放在硬件的数据缓冲区,然后自己去做其他工作。写入磁盘可以
在自己轮询之后写入,也可以其他线程写入。
二、I/O于NIO的工作流程图:
阻塞I/O流程图:
NIO流程图:
三、I/O与NIO的区别:
1、IO是面向流的,NIO是面向缓冲区(块)的。这是两种IO最大的区别,普通的IO读写都是基于流的操作(字符流或者二进制
流)。读写从开始到结束,直至读取到所有流。在读取的过程种不能移动。NIO在读写的时候都是基于缓冲区的操作。读
写的数据都通过缓冲区。数据处理相对灵活。
2、IO是阻塞线程的,NIO是非阻塞线程的。这个阻塞过程和非阻塞过程可以看基本概念和处理流程图进行理解。
3、Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单
独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线
程很容易来管理多个通道。
四、I/O与NIO的应用:
NIO相对于IO的优点是处理效率块,尤其是当要处理的数据比较小,处理请求的次数还比较频繁,这时候效率就会很快。
比如我们现在采用的socket,一个线程管理多个通道。这时候这个线程就不会闲下来,频繁的为各个通道服务。
I/O操作在日常也经常会用得到,我们要处理的数很长,并且不会频繁发送请求。比如我们要读取文件到内存中。进行处
理。比如我们调用C语言的库函数,scanf(),gets(),进程会一直等待你输入一个值。