NIO是JDK1.4提供的新的IO API,可以代替原来标准的IO API。NIO被称为New IO,又称NonBlocking IO,它和原来的IO有同样的作用和目的,但是使用方式完全不同。NIO对文件的读写操作会更快,因为NIO是面向缓冲区的、基于通道的IO操作。
NIO和IO的区别
IO操作是面向流的,文件的读写都要通过流的形式进行,比如FileInputStream和FileOutputStream;而且它的访问是阻塞的,当程序要访问文件时,如果文件尚未就绪,该线程就会发生阻塞,直至数据准备就绪位置,否则一直等在那里。
但是NIO不会,NIO是面向缓冲区的,它是基于通道操作的。当访问数据时,如果数据没有准备就绪,缓冲区会直接返回,不会一直等待数据就绪。NIO访问数据时,会首先创建一个通道,通道不存储数据,只用来传输;缓冲区是用来存储数据的,它既可以从程序到硬盘文件,也可以从硬盘文件到程序。不仅仅是因为NIO面向缓冲区、基于通道它就可以完全做到非阻塞,而是需要选择器。程序访问时,会将channel注册到选择器上,并监听选择器事件,当事件发生时,才会执行数据操作,而选择器可以注册多个通道,一个通道也可以监听多个选择器事件。
NIO核心内容
从NIO和IO的区别可以看出,NIO系统的核心在于通道(Channel)、缓冲区(Buffer)和选择器(Selector)。
通道:通道表示打开到IO设备(例如:文件、套接字)的连接,如果需要访问某个文件,需要该文件开启通道,相当于打开可以访问的开关。
缓冲区:缓冲区就像一个数组,可以保存多个相同类型的数据,它是一个容器,在NIO系统中主要用于和通道进行交互。数据从通道读入缓冲区,从缓冲区写入通道。
选择器:选择器是SelectableChannel对象的多路复用器,Selector可以同时监控多个SelectableChannel的IO状况,也就是说,利用Selector可以使一个单独的线程管理多个Channel,Selector是非阻塞IO的核心。