Selector selector = Selector.open();

普通的IO流的读取,写入都是一个字节一个字节或一个字符一个字符的循环进行,在这个过程中,程序是阻塞的,inputStream虽然既可以一个字节一个字节的读

inputSream.read(),也可以批量读.inputStream.read(byte[], pos, length),但这样频繁io导致效率很低。虽然也有bufferedInputStream,bufferedOutputStream,

自带缓冲区,但依旧是阻塞的。这样在面对多个连接时,就需要启多个线程,而大量的线程会占用太多的系统资源,线程的切换也会导致效率下降。

而新的IO体系,NIO,可以解决上诉问题。

NIO体系中几个新概念:

1 Buffer

Buffer:NIO中新建的类,包含数据的线性表结构。

2 Charset

设置加码解码规则

<span style="white-space:pre">	</span>@Test
public void test1() throws IOException{
Charset charset = Charset.forName("GBK");
String str = "hello。中国";
ByteBuffer byteBuffer = charset.encode(str);//将字符流转换成字节流,设置转换字符集
<pre name="code" class="java"><span style="white-space:pre"> </span>//Charset charset1 = Charset.forName("UTF-8");//解码字符集与加码的字符集不一样的化,出现乱码,因为字符转换成字节编码规则的不同转换的字节个<span style="white-space:pre"> </span> //数也不相同

Charset charset1 = Charset.forName("GBK");CharBuffer charBuffer = charset1.decode(byteBuffer);//将字节流转换成字符流,需要对应的字符集System.out.println(charBuffer.toString());}


3  Channel

信道,负责读取,写入Buffer中数据,并与底层网络交互。

4   Selector

解决多元异步IO操作在一个或很少的线程中执行。

数据流图:
数据发送端 -->发送端Buffer缓冲区 --> 发送端Channel  ---> 网络 --> 接收端Channel  -->接收端Buffer缓冲区  -->数据接收端

Selector如何实现无阻塞IO

1.创建Selector
Selector selector = Selector.open();

2. 注册Channel

SelectionKey key = channel.register(selector, SelectionKey.OP_ACCEPT)
SelectionKey:Channel向Selector注册时返回的身份标识,每个Channel都有一个SelectionKey,注册时同时加入自己感兴趣的事件。

SelectionKey对应一个Selector和一个Channel;

SelectableChannel channel = selectionKey.channel();
Selector  selecotr = selectionKey.selector();

事件类型有:SelectionKey.OP_ACCEPT:接受连接就绪事件
SelectionKey.OP_CONNECT:连接成功就绪事件

SelectionKey.OP_READ,:读就绪事件

SelectionKey.OP_WRITE:写就绪事件

3. Selector.select()

返回已准备就绪的通道的SelectionKey的个数。就绪表明有Channel中发生了以上四种类型事件的一种或几种。
int select():阻塞到至少有一个通道在你注册的事件上就绪了。
int select(long timeout):和select()一样,除了最长会阻塞timeout毫秒(参数)。
int selectNow():不会阻塞,不管什么通道就绪都立刻返回,此方法执行非阻塞的选择操作。如果自从前一次选择操作后,没有通道变成可选择的,则此方法直接返回零。
4. selector.selectedKeys()
Set selectedKeys = selector.selectedKeys();

如果select返回的值不为0,表明有通道上发生事件,则可通过selectedkeys获取所有的key,再通过对应的事件类型在对应的Channel上进行对应的读,写操作。





NIO机制总结的更多相关文章

  1. 为tomcat启用nio机制

    tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态. ...

  2. Java NIO 机制分析(一) Java IO的演进

    一.引言 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员再开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要有以下一些问题: (1)没有数据缓冲区,I/O性能存在问题 ...

  3. 【深入Java虚拟机】之二:Java垃圾回收机制

    [深入Java虚拟机]之:Java垃圾收集机制 对象引用 Java中的垃圾回收一般是在Java堆中进行,因为堆中几乎存放了Java中所有的对象实例.谈到Java堆中的垃圾回收,自然要谈到引用.在JDK ...

  4. Java 垃圾收集机制

    对象引用 Java 中的垃圾回收一般是在 Java 堆中进行,因为堆中几乎存放了 Java 中所有的对象实例.谈到 Java 堆中的垃圾回收,自然要谈到引用.在 JDK1.2 之前,Java 中的引用 ...

  5. JAVA基础知识之NIO——Buffer.Channel,Charset,Channel文件锁

    NIO机制 NIO即NEW IO的意思,是JDK1.4提供的针对旧IO体系进行改进之后的IO,新增了许多新类,放在java.nio包下,并对java.io下许多类进行了修改,以便使用与nio. 在ja ...

  6. 【深入Java虚拟机】之八:Java垃圾收集机制

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/18076173 对象引用 Java中的垃圾回收一般是在Java堆中进行,因为堆中几乎存放了J ...

  7. 浅析java内存管理机制

    内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...

  8. java I/O工作机制

    java I/O 的基本架构: 1:基于字节操作的I/O接口 InputStream OutputStream 2:基于字符操作的I/O接口 Writer 和Reader 3:基于磁盘操作的I/O接口 ...

  9. [HBase] 服务端RPC机制及代码梳理

    基于版本:CDH5.4.2 上述版本较老,但是目前生产上是使用这个版本,所以以此为例. 1. 概要 说明: 客户端API发送的请求将会被RPCServer的Listener线程监听到. Listene ...

随机推荐

  1. lucene 实现word,pdf全文检索源码

    创建索引: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import jav ...

  2. NOIP2015 普及组(Junior) 解题报告

    1. 金币 (coin.cpp/c/pas) 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币 ...

  3. 由 OR 引起的死循环

    在客商迁移测试时,程序一旦开始执行就不能自动停止.只能通过手动中断应用服务器的进程来停止.检查迁移的一个表,这个表迁移前没有数据,迁移最多会插入3w条左右数据,但是迁移过程执行2个多小时候再看,已经有 ...

  4. Jersey的异常处理

    Jersey框架为我们提供了更为通用异常处理方式.通过实现ExceptionMapper接口并使用@Provider注解将其定义为一个Provider,可以实现通用的异常的面向切面处理,而非针对某一个 ...

  5. 修改.htaccess实现子目录绑定示例分享

    <IfModule mod_rewrite.c>RewriteEngine On  RewriteBase /# 把 www.jb51.net改为你要绑定的域名.# 如果是域名:Rewri ...

  6. AD RMS Bulk Protection Tool 批量加密解密office文档

    1.Active Directory Rights Management Services Bulk Protection Tool  http://www.microsoft.com/zh-cn/d ...

  7. QLGame 2d Engine Android端环境搭建(通过jni读取assets目录的文件)

    QLGame 2d Engine win端已经实现了一个动物的动画了,初步的东西已经完成,考虑在Android端也实现这些基本的东西,这样跨平台的引擎也就实现了! 要在Android下编程,首先要实现 ...

  8. NetFlow网络流量监测技术的应用和设计(转载)

    http://blog.chinaunix.net/uid-20466300-id-1672909.html http://www.cww.net.cn/news/html/2014/12/25/20 ...

  9. 如何将一个IP地址移出PBL,不然,国内邮件服务器不能正常发送国外邮件哟。

    550 OU-001 Mail rejected by Outlook for policy reasons. If you are not an email/network admin please ...

  10. C#学习笔记一:C#开发环境的设置

    C#是.NET Framework的一部分,用于编写.NET应用程序. C#集成开发环境(IDE) 微软提供了以下C#编程开发工具: Visual Studio 2010 (VS) Visual C# ...