Java NIO概述

在这里插入图片描述

第一章 Java NIO概述

Java NIO(New IO或Non Blocking IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更高效的方式进行文件的读写操作。

1.1 阻塞IO

通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。传统的Server/Client模式会基于TPR(Thread per Request),服务器会成为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求。这种模式带来的一个问题就是线程数量的剧增,大量的线程会增大服务器的开销。大多数的实现为了避免这个问题,都采用了线程池模型,并设置线程池线程的最大数量,这又带来了新的问题,如果线程池中有100个线程,而有100个用户都在进行大文件下载,会导致第101个用户的请求无法及时处理,即便第101个用户只想请求一个几KB大小的页面。

1.2 非阻塞IO

NIO中非阻塞I/O才用了基于Reactor模式的工作方式,I/O调用不会被阻塞,相反是注册感兴趣的特定I/O时间,如刻度数据到达,新的套接字连接等等,在发生特定事件时,系统再通知我们。NIO中实现非阻塞I/O的核心对象就是Selector,Selector就是注册各种I/O事件的地方,而且当我们感兴趣的事件发生时,就是这个对象告诉我们所发生的事件。

在这里插入图片描述
从上图可以看出,当有读或写等任何注册的事件发生时,可以从Selector中获得响应的SelectionKey,同时SelectionKey中可以找到发生的事件和该事件所发生的具体的channel,以获得客户端发送过来的数据。

非阻塞指的是IO事件本身不阻塞,但是获取IO时间的select()方法是需要阻塞等待的。区别是阻塞IO会阻塞在IO操作上,NIO阻塞在事件获取上,没有事件就没有IO,从高层次看IO就不阻塞了。也就是说只有IO已经发生那么我们才评估IO是否阻塞,但是select()阻塞的时候IO还没有发生,何谈IO的阻塞呢?NIO的本质是延迟IO操作到真正发生IO的时候,而不是以前的只要IO流打开了就一直等待IO操作。

IONIO
面向流(Stream Oriented)面向缓冲区(Buffer Oriented)
阻塞IO(Blocking IO)非阻塞IO(Non Blocking IO)
选择器(Selector)

1.3 NIO 概述

Java NIO由一下几个核心部分组成:

  • Channels
  • Buffers
  • Selectors

虽然Java NIO中除此之外还有很多类和组件,但Channel、Buffer和Selector构成了核心API。其他组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类

1.3.1 Channel

首先说一下Channel,可以翻译成『通道』。Channel和IO中的Stream(流)是差不多一个等级的。只不过Stream是单向的,譬如:InputStream、OutputStream。而Channel是双向的,既可以用来进行读操作,也可以用来写操作。

NIO中的Channel的主要实现有:FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel。分别对应文件IO、UDP和TCP(Server 和Clent)

1.3.2 Buffer

NIO中的关键Buffer实现有:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer,分别对应基本数据类型:byte、char、double、float、int、long、short

1.3.3 Selector

Selector运行单线程处理多个channel,如果你的应用打开了多个通道,但每个连接的流量很低,使用Selector就会很方便。例如在一个聊天服务器中。要使用Selector,得向Selector注册Channel,然后调用它的select()方法,这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就会处理这些事件,事件的例子犹如新的连接进来、数据接收等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值