NIO是New IO 的简称,在jdk1.4 里提供的新api 。Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持,字符集编码解码解决方案。
Channel : 一个新的原始I/O 抽象。 支持锁和内存映射文件的文件访问接口。 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O 。
传统的I/O
使用传统的I/O程序读取文件内容, 并写入到另一个文件(或Socket), 如下程序:
File.read(fileDesc, buf, len); Socket.send(socket, buf, len);
会有较大的性能开销, 主要表现在一下两方面:
1.上下文切换(context switch), 此处有4次用户态和内核态的切换。
2.Buffer内存开销, 一个是应用程序buffer, 另一个是系统读取buffer以及socket buffer。
其运行示意图如下:
1.先将文件内容从磁盘中拷贝到操作系统buffer
2.再从操作系统buffer拷贝到程序应用buffer
3.从程序buffer拷贝到socket buffer
4.从socket buffer拷贝到协议引擎.
NIO
NIO技术省去了将操作系统的read buffer
拷贝到程序的buffer
, 以及从程序buffer拷贝
到socket buffer
的步骤, 直接将 read buffer 拷贝到 socket buffer. java 的 FileChannel.transferTo()
方法就是这样的实现, 这个实现是依赖于操作系统底层的sendFile()实现:
public void transferTo(long position, long count, WritableByteChannel target);
它的底层调用的是系统调用sendFile()方法
sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
如下图: