Java NIO学习

来源:互联网 发布:杂志订阅 知乎 编辑:程序博客网 时间:2024/05/17 22:21

概述

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/ ,非常不错的网站

0 0
原创粉丝点击