前言
本文作者:FUNKYE(陈健斌)
正文
首先,我们一起来简单的了解下,什么是io流?
1.可以把io流想象成汽车,船,水流.问题来了,想象成这样的特点是什么?顾名思义,水流肯定是从源头,流向一个目的地,汽车,轮船也可以从特定的出发点,到目的地.他们的开始目的跟结束目的是一致的.
再来伸展下问题1,io流的一些特征.结合我们上面所讲,比如说是水流,汽车,有什么特性,他要遵守交通规则,水流也一样,所以它是一个有顺序,有起点跟终点的一个字节集合.
2.再来说下io流的输入输出流的作用,也是顾名思义,我希望大家在遇到面试官提问的时候,能先记牢他说的一个问题标题,很可能这个标题就蕴藏着答案.输入流,很明显把一个外部(你可以理解成计算机中的文件)的东西,读取后输入到我们的进程中.而输出流很简单了,比如我们在做开发最常见的常见应该是保存某些文件,比如图片,text?所以我们要保存文件的时候该干嘛?就是进程中的数据写入到我们计算机的一个文件中.
3.javaio中的超类有哪些?
- java.io.InputStream 字节输入流
- java.io.OutputStream 字节输出流
- java.io.Reader 字符输入流
- java.io.Writer 字符输出流
关于问题3,就不做过多的延展,因为我相信现在没有多少人还会去用io,而不是nio,以我个人的性格,我可能了解到这,就好了.
4.NIO是什么?
- nio是一个同步非阻塞io
- 为什么要有NIO?同步非阻塞io,这个我们也顾名思义一下,我看到过有上厕所的例子,也有烧开水的例子.我觉得烧开水的例子能更形象生动,所以我用烧开水来举例.首先同步对吧,我们烧了一排的开水壶,这时候如果用bio来做处理会怎么样呢?我先去水壶一号,水壶一号水烧好了,我再去水壶二号.而我们的nio,同步非阻塞怎么理解?我先去看一下水壶1号,没烧好,我再去看二号,直到N号.而且我不需要一直等待的去看水烧好了没,我去轮询的去查看即可,比傻傻的站那等水烧开是不是好多了?
- NIO的三大核心部分:channel(通道),buffer(缓冲区),selector(选择区,这块就是个多路复用,一个selector可以监听多个通道.)
- javanio与io的区别是?其实我们上面总结下来,可以发现io的特点就是他有一个流的存在,比如一个快递送到你家了,好了这就结束了.这意味这你要一直等待快递员一路的派送直到你家.而NIO是面向缓冲区,怎么说呢,拿最近很火的蜂巢收件箱来说吧,多个快递员(client),对应对个接收者(channel),而蜂巢的应用就属于selector,因为他会知道你的快递到了.而缓冲区对应的就是收件箱.所以对于快递员跟接收者最终还是到了一个地方去操作,那就是缓存区,我们的收件箱去.
5.什么叫多路复用?
- 举一个非常简单的例子,比如一个小区有N栋楼,保安如果是一对一栋楼,那么你觉得物业会这么傻的去请那么大量的保安队伍吗?所以我们N栋楼的安全保障,由一个保安队直接承包,无论是哪栋楼有安全问题,都是由同一个队伍的保安负责,这样就避免了比如A栋经常有问题需要保安去巡查,而B栋完全没这个困扰,然后也由一个保安去巡查的资源浪费问题.
6.BIO,NIO,AIO的特点介绍:
就由我们刚才的快递员问题来举例吧
- 同步阻塞BIO:你下单买了个东西,然后你就一直等快递员派件送达,期间你及时有N个快递你也只能先等待第一个派件,而且期间你连睡觉,喝水,吃饭都做不了.
- 同步非阻塞NIO:你下单买了N个东西,然后你隔三差五的看看这个快递到了没,那个快递到了没,但是你还是吃不了饭喝不了水,只能再等一堆的快递送达.
- 异步阻塞io:我在家里,等快递员打电话给我,我再去拿快递.
- 异步非阻塞AIO:我在家里,想干嘛就干嘛,快递员打电话说送到了,我再去拿.
总结
本文简单的去口语化io的概念,并没有做过多的深入,希望对概念不是很清楚的同学可以起到一个帮助.
接下来是一些题外话:
写本篇博客初衷:最近面试被问到了io相关问题,发现面试官特别喜欢故意绕一下,让你一下搞不清什么是bio,什么是nio,什么是aio,首先我个人缺点很明显,对喜欢的技术栈,我会着迷,去深入研究它(我不敢说我任何的一个技术知识是完全掌握的),而不是非常感兴趣的技术,我会处于一个刚好够用,不容易出错的一个状态即可.(毕竟我是个谨慎的人,经常即使自己了解了,我还会做进一步的验证.)
写这篇博客的时候,不禁想到一个问题?基础差?怎么样才能算基础差?怎么样才能算基础好?还是说这只是为了压制面试者的一个策略而已?难道拿起锄头跟锤子该干嘛心里没数吗?可能也是个人资历尚浅的一个疑问吧.