java中的I/O与NIO区别

                                          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(),进程会一直等待你输入一个值。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值