绝大多数应用程序在运行过程中都会进行两种类型的计算:一种是占用CPU时间的计算,另外一种是与数据输入/输出(I/O)相关的计算。在这两种计算中,一般是与I/O相关的计算所花费的时间占较大的比重。这其中的主要原因是在进行I/O操作时,一般需要竞争操作系统中有限的资源,或是需要等待速度较慢的外部设备完成其操作,从而造成I/O相关的计算所等待的时间较长。从性能优化的角度出发,提升I/O相关操作的性能会对应用程序的整体性能产生比较大的帮助。
最早的java.io包把I/O操作抽象成数据的流动,进而有了流(stream)的概念。在Java NIO中,则把I/O操作抽象成端到端的一个数据连接,这就有了通道(channel)的概念。
1. 流
Java中最基本的流是在字节这个层次上进行操作的。也就是说基本的流只负责在来源和目的之间传输字节,并不负责对字节的含义进行解释。在基本的字节流基础上,Java也提供了一些过滤流(filter stream)的实现。这些过滤流实际上是基本字节流上的一个封装,在其上增加了不同的处理能力,如基本类型与字节序列之间的转换等。这些过滤流对开发人员的接口更加友好,可以自动完成很多转换工作。