概述
NIO是一种基于缓存的、非阻塞的异步IO。NIO主要涉及到三个概念:Buffer(缓存),Channel(通道),Selector(选择器)。NIO和传统IO不同在于:NIO是基于缓存的,而传统IO是基于流的,传统IO的数据是从一个出发地流向一个目的地,而NIO的数据是从一个Buffer通过Channel流向另一个Buffer的。这样,线程就可以将IO过程交给Channel去管理,自己可以做其它是,所以NIO也是异步的,非阻塞的,而传统IO在IO过程中必须等待,是同步的,阻塞的。NIO通过Selector可以监听多个Buffer的事件,并响应事件对IO结果进行处理,这样,就可以用一个线程实现监听多个通道,对于单核处理器来说,这会提高性能。总的来说,就是:
(1)NIO是异步的,非阻塞的
(2)NIO是基于缓存的
(3)NIO即可读又可写,是双向的。
(4)NIO提供selector,可以用单线程实现多个通道的监听
Channel
通道用来操作Buffer,通过通道,可以写入数据到Buffer,或者从缓存读取数据。
打开通道
RandomAccessFile file = new RandomAccessFile("d://sample.txt","rw");
FileChannel fileChannel = file.getChannel();
这里打开的是一个FileChannel,当然还有其他类型的通道,参看:Java NIO Channel
Buffer
Buffer是缓存,是一个内存区块,可供channel写入或读取。
创建Buffer
ByteBuffer buffer = ByteBuffer.allocate(48);
切换工作模式
Buffer有两种工作模式“读取”和“写入”,读取之前,要调用filp()
切换到读取模式:
//切换到读取模式
buffer.flip();
//读取数据
while(buffer.hasRemaining()){
char word =(char)buffer1.get();
}
同样,写入之前调用clear()
方法,清空buffer数据,准备写入:
buffer.clear();
fileChannel.read(buffer );
Seletor
用来监听多个通道,没用过感触不深,还是看参考文档靠谱!
参考文档:http://tutorials.jenkov.com/ ,非常不错的网站