NIO其实是一个组装词汇,它的本意是New IO,这个是JDK1.4中引入的一个IO库,顾名思义,就是一个新的的IO库,采用了全新的实现方式来完成IO操作。
那么我们来看一下New IO到底有和老的IO有什么变化和区别。
Java IO和Java NIO最大的区别就是IO是面向流,NIO面向缓冲区。
面向流意味着每次从流中读取一个或者多个字节,直到读取完所有字节,他没有被缓存到任何地方,也不能移动流中的数据,比较僵硬的一个操作方式。
而面向缓冲区,则读取数据到一个可以稍后处理的缓冲区内,这个缓冲区内可以适当处理和调整数据,当然缓冲区也不是无限大,所以要确保前面读取的数据及时读出,防止被后面的数据覆盖。但是这样一来,灵活性已经有了很大的提升。
打个比方,一个人从车上搬运砖块下车,面向流就是按顺序搬运少量砖头,但是每次上车下车的消耗可能才是最累人的,面向缓冲区则是可以整理出一堆砖头进行批量搬运,比如一次可以搬运100块,节省了搬运次数,然后这100块砖头在等待被搬运的时候还能稍微做一下处理,比如把破碎的砖头放在中间,这样就不会掉出去。
Java IO和Java NIO另一个很大的区别是阻塞和非阻塞。
Java IO的各种流是阻塞的,这意味着当一个线程调用read()或者write()的时候,该线程阻塞,不能处理其他任何事情,直到该数据被读取或者写入完成。
Java NIO是非阻塞的,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用,就什么都不会获取,也不会使得线程阻塞等待数据。写入数据也是同样,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程可以同时干其他事情。一个单独的线程现在可以管理多个输入和输出通道。
而管理多个通道靠的是选择器(Selectors),可以把这个想象成一个交警,指挥着各个通道的数据有序地处理而不会形成阻塞。