JAVA-NIO

一、概述:

        java-nio全称(java non-blocking IO),是指java 1.4提供新的API,从jdk1.4开始,java提供了一系列改进的输入/输出新特性,被称为NIO(new IO)是同步非阻塞的。而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区
中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

       

二、NIO的三大核心组件原理(selector、channel、buffer)

1、每个channel对于一个buffer;

2、Selector对应一个线程,一个selector对应多个channel,即一个线程对应多个channel;

3、该图反映了有三个channel注册到一个selector;

4、程序切换到哪个channel是由事件决定的;

5、selector会根据不同的事件,在各个通道上切换;

6、Buffer就是个内存块,低层就是个数据;

7、数据的读取和写入就是通过buffer,在bio中要么是输入流要么是输出流,不能双向,而在buffer中可以读也可以写,但是需要flip方法切换,channel是双向的,低层的操作系统通道也是双向的。

三、缓存区(Buffer)

       3.1概述:缓存区本身是可以读写数据的内存块,可以理解为一个容器对象(含数组),该对象提供了一组方法,可以轻松的使用内存块,缓存区对象内置了一些机制,能够跟踪和记录缓存区的状态变化情况。channel提供从文件,网络读取数据的通道,但是读取和写入的数据必须经过buffer。

3.2Buffer类及其子类

3.2.1在NIO 中buffer是一个顶级父类,它是个抽象类,类的关系层次图如下:

3.2.2 Buffer类定义了所有缓存区都具有的四个属性来提供关于所有包含的数据元素的信息:

3.2.3 Buffer类相关方法

3.2.4最常用的buffer--ByteBuffer

 对于java中的基本类型(boolean除外)都有相应的Buffer对应,最常用的是ByteBuffe,其api如下:

3.3Buffer的注意事项:

3.3.1ByteBuffer支持类型化的put和get,put放什么类型,get就应该使用对于的类型取数据,否则会出现BufferUnderflowExceptiop;

3.3.2可以将一个Buffer转为可读Buffer,buffer.asReadOnlyBuffer();

3.3.3NIO提供了MappedByteBuffer可以让文件直接在内存中修改,而如何同步到文件有NIO来完成;

3.3.4NIO还支持多个Buffer(Buffer数组)完成读写操作,即Scanttering与GathEring

四、通道(Channel)

4.1概述:NIO的通道类似与流,但是有区别:1.通道可以同时读写,而流是单项的;2.通道可以实现异步读写数据。

4.2.通道类结构:

Channel在NIO中是一个接口 public interface Channel extends Closeable{},常用的Channel类有,FileChannel(用于文件数据读写),DatagramChannel(用于UDP的数据读写),ServerSocketChannel与SocketChannel(用于TCP数据的读写)

4.2.1 FileChannel(用于文件数据读写)、

常用API

copy文件原理图

 

五、Selector(选择器)

5.1 概述:Java的NIO,用非阻塞的IO方式。可以用一个线程,处理多个客户端连接,其核心就是Selector。

5.2 Selector执行流程示意图

    1).netty的IO线程NioEventLoop聚合了Selector,可以并发处理成百上千个客户端;

    2).当线程从某客户端Socket通道读写数据时,若没有数据可用时,该线程可以执行其他任务;

    3).线程通常将非阻塞IO的空隙时间用在其他通道上执行IO操作,所以单独的线程可以管理多个输入输出通道;

    4).由于读写是非阻塞的,这就可以充分提升IO的运行效率,避免由于频繁IO阻塞导致的线程挂起;

    5).一个I/O线程可以并发处理多个客户端的读写操作,这从根本上解决了传统阻塞I/O一连接一线程模型,架构的性能、弹性伸缩能力,可靠性都得到了极大的提升。

5.3Selector类相关方法

六、NIO非阻塞网络编程原理分析

对上图说明:

1)当客户端连接时,会通过ServerSocketChannel得到SocketChannel;

2)Selector进行监听Select方法,返回有事件发生的通道个数;

3)将SocketChannel注册到Selector上,register(Selector sel,Int ops),一个Selector可以注册多个Channel;

4)注册返回一个SelectionKey会和Selector关联(集合);

5)进一步取得各个SelectionKey;

6)通过Selection返向获取SocketChannel;

7)  可以通过得到的Channel完成业务处理。

下文将用代码实现NIO 。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值