NIO学习(一)

JDK1.6及之前只能用   NIO(1.4后才有),BIO
JDK1.7开始之后有   AIO(NIO 2.0)

1.先理解几个概念:同步,异步,阻塞,非阻塞
###同步:用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪;自己上街买衣服,自己亲自干这件事,别的事干不了。 
###异步:用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知);告诉朋友自己合适衣服的尺寸,大小,颜色,让朋友委托去卖,然后自己可以去干别的事。(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS) 
###阻塞:所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止
###非阻塞:非阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待

2.IO读写时,多路复用机制都会依赖对一个事件多路分离器,负责把源事件的IO事件分离到对应的事件分离器。事件分离器分为两种:Reactor(同步IO)和Proactor(异步IO)

3.BIO(同步阻塞IO):同步并阻塞,即服务器实现模式是一个连接一个线程,当客户端有连接请求时就需要启动一个线程进行处理,如果这个连接不做任何事就造成了不必要的线程开销,当然可以通过线程池机制改善。提高线程的利用率,减少系统在管理线程和线程上下文切换的开销。

4.NIO(同步非阻塞IO):同步非阻塞,即服务器实现模式是一个请求一个线程,当客户端发送的连接请求都会注册到多路复用器,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。用户线程也需要时不时的询问IO是否就绪。

   NIO采用Reactor模式的事件分离器:注册所有感兴趣的事件处理器,单线程轮询选择就绪事件,执行事件处理器。
   异步阻塞IO:  
       此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,****这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select属于同步操作。因为select之后,进程还需要读写数据),从而提高系统的并发性!  

5.AIO(异步非阻塞IO):异步非阻塞,即用户线程只需要发出IO操作就可以返回,等IO操作真正完成后,线程会接受到IO操作发出的IO操作完成的通知,此时用户线程只需要对数据处理就可以,不需要进行实际上的IO操作,因为真正的IO操作已经由内核完成了。AIO简化了程序的编写,stream的读写都有OS来完成,但是需要提供数据缓冲区的地址和大小。不用再像NIO那样遍历Selector。Windows基于IOCP(I/O Completion Port///IOCP是一个异步I/O的API)实现AIO,Linux只有epoll模拟实现AIO

AIO采用Proactor模式的事件分离器

6.AIO NIO BIO 的适用场景:
BIO 适合连接数目比较小并且较固定的架构。
NIO 适合连接数目多且连接短(轻操作)的架构
AIO 适合连接数目多且连接长(重操作)的架构

7.为什么使用NIO:NIO的创建目的是为让java程序员可以高速IO而无需编写自定义的本机代码。NIO将最耗时的IO操作(即填充和提取缓冲区)转移到了操作系统,因而可以极大的提高速度。原来的IO是以流的形式操作数据,而NIO是以块的形式操作数据,所以NIO比较快

8.NIO中的常用的类和方法:
1.Paths工具集
Path类中toRealPath()融合了toAbsolutePath()和normalize()(消除冗余符号)方法。“.” 表示当前目录 “..”表示父目录
2.Files中的目录树。
3.应用NIO进行文件的操作(删除,移动,复制)注意文件一定添加“.类型”(interest)
4.NIO  最简单的IO操作 需要借用BufferedWriter/BufferedReader 类 见实例:com.wcx.NIO.FileIO
5.WatchService类监听文件是否发生改变、FileChannel类
6.将来式异步读取数据,回调式异步读取数据
7.NIO中的Channel是双向的,既可以用来读又可用来写,还可以同时进行操作,IO中的Stream是单向的。在调用channel的write方法之前必须调用buffer的flip方法,否则无法正确写入内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值