Java NIO(New Input/Ouput)是从JDK1.4开始引入的新技术,是一种高速的、面向块的数据输入/输出技术,它弥补了原有的流式I/O的不足。
传统的“流”式IO可以被视为单个字节的移动,即通过IO流对象一次移动一个字节。即使传输的是多个字节、字符、基本类型数据或对象的各种高级流类型,其内部实现也是基本相同的(先将各种类型数据转换为字节,进行传输和存储,再将字节转换为其原有类型的数据)。
NIO与传统IO实现的功能是相同的,其不同之处在于数据打包和传输的方式,NIO采用了“块”IO的实现方式,每次处理的是一个整体的数据块,而不是一个字节。它将操作中最耗时的部分转移回操作系统,因而可以极大地提高了IO效率。
NIO API定义在JDK的java.nio及其多个子包中,实际上传统的流式IO与NIO已经进行了集成,JDK1.4中java.io包就以NIO为基础进行重新实现,因此可以利用NIO的一些特性,例如java.io.*包中的一些类也包含了一块的形式读写数据的方法,以提高处理速度。
缓冲区(Buffer)
缓冲区是NIO的核心对象,用于缓存要写出、或刚读入的数据。在NIO中,所有数据都要通过缓冲区处理,将数据积累到一定的规模,再将整个数据块写出到输出流对象中,这与流式IO将数据直接写出到流对象中明显不同,数据读取操作的情况也是类似的。下面便是缓冲区类继承层次图:
从上图中可以看出Buffer是所有缓冲区的根类,同时也可以看出存在很多基本类型缓冲区,如:IntBuffer、LongBuffer等。
通道(Channel)
通道是NIO中的另一种重要对象,通过它可以实现数据的读入和写出操作,与先前的“流”相比,其不同之处在于通道是双向的,而普通的IO流只能单向地传输数据,这使得通道可以比流更好地反映底层操作系统的真实情况。
使用Channel传输数据时,我们永远不会直接将数据写入通道中、或直接从通道中读取数据,而是使用Buffer作为缓冲区,这样处理效率会高一些。通道类的继承层次图如下:
上面这些就是NIO最基本和最重要的知识点,后面的文章将继续由浅到深的学习NIO,并且通过实际实例来说明如何使用NIO。