没有NIO之前,数据只能以流的形式来传输的,而在操作系统中,底层数据都是以块的形式读写,为了提高java io的性能,更好的利用操作系统的特性,因而提出了NIO。
Java NIO中得定义了数据容器作为缓冲区,即Buffer,在通道Channel传输数据都需要用到缓冲区。
Buffer四个要点:
- 位置
- 限制
- 容量
- 标记
0<=标记 <=位置 <=限制 <=容量
标记可以调用API设置,默认是NULL
位置的开始值为0,再读写数据时移动到下一位,当时不能超过限制否则出现异常
限制默认为容量大小,在读数据时,为了读取到有效的数据(上次写数据时,没有写到容量处,有空余),一般在读取之前需要设置一个限制(设置为上次读数据的位置处),一般是调用flip()方法
容量为分配的Buffer的固定大小
Buffer二个重要的API:
- clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。
- flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。
创建一个ByteBuffer
//分配一个新的字节缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
循环语句通过buf缓冲区将字节从一个信道复制到另一个信道:
buf.clear(); //将位置设置为 0,将限制设置为容量
while (in.read(buf) >= 0 || buf.position != 0) {
buf.flip(); //将限制设置为当前位置,然后将位置设置为 0
out.write(buf);
buf.compact(); //以防写入不完整
}
参考资料:
http://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html