传统的输入/输出流都是阻塞式(如果数据源没有数据,读操作将会阻塞线程),而且都是以字节为单位对数据进行读写,效率不高。jdk1.4开始提供NIO,对输入/输出功能进行改进。

NIO采用内存映射文件来处理输入/输出,将文件或者文件的一段映射到内存中,这样就可以像访问内存一样来访问文件了,速度得以提升。java.nio包中的Buffer类用于提供缓存。基本数据类型都有对应的Buffer实现类,较为常用的是ByteBuffer,CharBuffer。

Buffer中有四个比较重要的参数,可参考下图。当Buffer装入数据后,调用filp(),limit将置为position,position置0,为进行输出做好准备。当输出数据结束后,调用clear(),不需要清空缓存中内容,而是将limit置为capacity,position置为0,为重新输入数据做好准备。

其基本用法参考下列代码,注意get()将移动position,而get(int index)不会。

public class BufferTest {
    public static void main(String[] args) {
        CharBuffer cb = CharBuffer.allocate(8);
        System.out.println(cb.capacity()); // 8
        System.out.println(cb.limit()); // 8
        System.out.println(cb.position()); // 0
        cb.put('a');
        cb.put('b');
        cb.put('c');
        System.out.println(cb.position()); // 3
        cb.flip();
        System.out.println(cb.limit());
        System.out.println(cb.position());
        System.out.println(cb.get()); // a
        cb.clear();
        System.out.println(cb.limit()); // 8
        System.out.println(cb.position()); // 0
        System.out.println(cb.get(2)); // c
        System.out.println(cb.position()); // 0
    }
}