Java三种IO的区别

如果把流看做是水,各种IO看做是接水的方式,那么:
BIO:只有一个管子,别人想给你水 都得通过这个管子,如果人多了那就得排队一个个的给你,这个就称为阻塞。 而你接水,也只能一个个的接,接完了就得去灌溉,然后回来接第二个。【所以,他叫同步阻塞】

如果有很多人要给你水,你是不是很累? 来回跑累瘫了。

NIO:有很多个管子,别人想给你水 就往管子里灌就好了,不用排队,这就是非阻塞。 而你也不用一个个的接水了,而是在这些管子里来回巡视,当发现哪根管子有水了就 放一个桶在那, 等接完了这个管子里的水以后,继续巡视,这个称为同步, 当巡视了一个轮回后,就把这些桶全部提走去灌溉,灌溉完了再回来接着巡视。 【所以,他叫同步非阻塞】

如果有很多人给你水,你是不是轻松多了?

AIO:给你水的逻辑跟NIO一样,但是接水略有不同,你嫌弃巡视太累,于是在每个管子下放了一个水桶,这样别人给你水的时候你不用管,因为有多个水桶在接,这个称为异步。 当接完一轮后,你把这些水桶提走 拿去灌溉,然后又放回原位。【所以,他叫异步非阻塞】

你只需要在水接完后,拿去灌溉下是不是更轻松了?

但是,在现实中,也不会这么理想,以前用BIO的时候,通常会安排很多人(线程)一起来接水,你接完了就去灌溉,下一个在此等候,这个接完了再去灌溉,下一个又在此等候。 看起来挺好的,但是问题在于,别人给你水的时候需要排队,所以会存在瓶颈,你安排再多的人也没用。 其次,你安排这么多人 是不是要支付更多的工资呢?压力也不小吧。
那NIO呢,解决了上面给水需要排队的瓶颈,但是接水灌溉 也只有一个人在做,但是他不用来回跑,只需要守着水管,接完一轮水,统一灌溉一次就好了。 节约了不少人工费吧,不用请这么多人了。
AIO呢?看起来比NIO好对不对?因为不需要巡视了,接到了水再行动,但是如果有很多人给你水,你是不是要买很多的桶呢?这些桶也是开支啊,耗钱的。
综合看起来,一般在现实中,面对高并发,都是用NIO,因为给水不阻塞,接水又只需要一个人,比较省资源。 而且还可以在这个基础上做一些优化,比如适当的加一些人来接水,或者适当的加一些水桶进来。这些都是可控的。