io、nio的区别——java基础面试题

1.字节流和字符流的区别及应用场景

字节流以一个字节为单位进行读写操作,而字符流以两个字节为单位读写。字节流一般用于图片视频音频的流操作,而字符流一般用于中文的流数据。

2. 简述阻塞IO、非阻塞IO、多路复用IO、异步IO的概念及区别

**阻塞IO:**所谓的阻塞IO就是在读写过程发生阻塞,这个过程是当用户线程发起OI请求时,内核就会去检查数据是否就绪,如果数据还没就绪,则用户线程就会处于阻塞状态,并且会让出cpu。数据就绪后,内核才会复制数据到用户线程并返回,用户才能解除block状态。

**非阻塞IO:**当用户线程发起一个read请求后,并不需要等待,而是马上得到一个结果。如果返回结果为error,说明数据还没就绪,用户线程将继续请求read。直到数据就绪后,而且用户线程还在发起read请求,内核才把数据复制到用户线程。也就是说,整个过程中,用户线程都不会让出cpu,当数据还没就绪时,用户线程不断的询问内核数据是否就绪,一直占用cpu。

**多路复用IO:**多路复用IO模型是目前使用的比较多的模型,NIO就是典型的多路复用IO。在多路复用IO模型中,会有一个线程不断的轮询询问socket的状态,只有当socket真正有读写事件时,才真正调用实际的IO操作。多路复用IO好处主要体现在一个线程管理多个socket,而且当真正有读写事件来时才使用IO资源。另一方面,跟非阻塞IO相比它性能更多的原因在于非阻塞IO的轮询询问数据是否就绪是用户线程发起的,而多路复用IO的轮询询问是内核发起的,这个效率会高很多!

**异步IO:**这是最理想的IO模型。用户发起读写操作后,就可以继续干其他事情而不需等待。内核收到异步IO请求后就会立即返回,这就说明read请求成功了。然后内核等待数据就绪后就会把数据复制到用户线程并返回,之后再给用户线程发送一个信号告诉用户线程IO完成了。也就是整个过程,用户线程发起一个读写请求,内核就会异步执行IO,等到用户线程收到完成信号后就可以使用IO了!

3.IO与NIO的区别

io面向流,nio面向缓冲区。io阻塞,nio非阻塞。详情参考上述阻塞IO和多路复用IO模型!

**个人博客:java1024 家园**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值