经过前几天的学习,将BIO的基础知识总结完成,接下来今天我将总结学习NIO和AIO的知识点,在理解学习的基础上,去使用相关知识点进行编程学习。这次我将先总结NIO的知识点,再学习AIO的相关概念。

NIO

NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

NIO是采用内存映射文件的方式处理输出输出,可以将文件或者文件的一段区域映射到内存中,然后就可以像访问内存一样来访问文件,所以进行输入输出的速度比BIO快的多。

BIO是同步阻塞式;NIO 是同步非阻塞式
BIO 是面向流的, NIO 是面向缓冲区的
NIO 是一个线程从某个通道发送读取请求时,仅仅获取当前可以用的数据不会保持阻塞等待

1.Channel

Channel可以直接将文件的部分或者全部映射到 buffer中。注意不能直接访问Channel中的数据,包括 读写都不行,Channel只能与buffer进行交互。

常见方法有3个map/read/write

public class Test1 { public static void main(String[] args) throws Exception { File file = new File("data/Test1.java"); // 获取channel对象 FileChannel inChannel = new FileInputStream(file).getChannel(); 12345ByteBuffer buffer = ByteBuffer.allocate(256);// 构建一个容积为256的 buffer
// 从channel中获取数据写到buffer中。文件可能大于256,所以需要进行多次读取。 可以通过-1判定读取结束 while (inChannel.read(buffer) != -1) { // 将buffer中没有数据的部分封印起来 buffer.flip(); // 设置limit,limit之后的数据不允许操作 System.out.println(buffer.limit()); //256 Charset charset = Charset.forName("UTF-8"); // 参数为编码字符集名 称,创建对应编码字符集的解码器 CharsetDecoder decoder = charset.newDecoder();//通过Charset创建对应的解码器对象  CharBuffer cb = decoder.decode(buffer);// 使用解码器可以将 ByteBuffer转换为   CharBuffer System.out.println(cb); buffer.clear();// 清空buffer中的数据,同时将position设置为0,为下一次 读取操作做准备 } }
}

2. Buffer(缓冲区)

Buffer主要作用就是用于转入数据,然后输出数据。最基本的实现是ByteBuffer,可以在字节数组上进行 get/set操作;另外针对基本数据类型,系统提供了7种具体的实现,例如CharBuffer、ShortBuffer、 DoubleBuffer。

常用方法:capacity():int返回buffer的容积值
hasRemaining():boolean判断是否还有数据可以进行处理
remaing0:int获取position当前位置和limit界限之间的元素个数
position():int返回当前的操作位置
mark():Buffer设置标记位置,已被后面重返这个位置reset():Buffer将位置position重新返回到mark所在为位置rewind():Buffer 将position重新设置到0,并取消mark标记
put(obj):xxxBuffer用于向buffer中添加数据
get():xxx用于从buffer中获取数据

3.Selector

是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel通道的状态是否处于可读、可写。如 此可以实现单线程管理多个channels也就是可以管理多个网络链接。

使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上下文切换带来的开销

基本用法:

1. Selector的创建。通过调用Selector.open()方法创建一个Selector对象

2. 注册Channel到Selector

3. 轮询方式获取选择器上的状态值

AIO(异步非阻塞式 )

AIO最大的一个特性就是异步能力,这种能力对socket与文件I/O都起作用。AIO其实是一种在读写操作结束之前允许进行其他操作的I/O处理。

JDK7新增了一些和文件、网络IO相关的API,AIO最大的特性就是异步处理能力,一般用于网络编程和大文件IO处理中。AIO其实就是一种在读写操作结束之前允许执行其它操作的IO处理,等读写执行完毕自动通知调用后续处理。

1.将来式异步读取:使用Future用来保存异步操作的处理结果

Path path = Paths.get("data/a1.txt"); // 从语义的角度上说比File好一些,用于封装一个文件或者文件夹对象
AsynchronousFileChannel channel = AsynchronousFileChannel.open(path, StandardOpenOption.READ); ByteBuffer buffer = ByteBuffer.allocate(1024);
Future<Integer> future = channel.read(buffer, 0);
int readNum = future.get(); buffer.flip();
CharBuffer cb = CharBuffer.allocate(1024);
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
decoder.decode(buffer,cb,false);cb.flip();
String ss=new String(cb.array(),0,cb.limit());
System.out.println(ss);

2.回调式异步读取:回调式是采用事件处理技术实现的

Path path = Paths.get("data/a1.txt"); // 从语义的角度上说比File好一些,用于封装一个文件或者文件夹对象
AsynchronousFileChannel channel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>()
{ // 当读取完成后自动执行的方法 public void completed(Integer result, ByteBuffer attachment) {         System.out.println(Thread.currentThread().getName() + "读取数据完毕!");}// 当读取处理过程中出错时自动执行的方法 public void failed(Throwable exc, ByteBuffer attachment) {     System.out.println(Thread.currentThread().getName() + "读取数据出现异 常:" + exc); }
});
System.out.println("立即看到结果!");
while (true) { System.out.println(Thread.currentThread().getName() + "sleep...."); Thread.sleep(1000);
}

BIO、NIO、AIO总结

BIO:同步阻塞,实现模式为一个连接一个线程,就是客户端连接请求时,服务器需要启动一个线程进行处理。

NIO:同步非阻塞,实现模式为一个连接一个线程,客户端发起请求时会注册到selector多路复用器上,多路复用器会轮询所有有IO请求时才启动一个线程进行处理。

AIO:异步非阻塞,一个有效请求一个线程,客户端IO请求都是由OS操作系统先完成了再通知服务器应用启动线程进行处理。

区别:

同步阻塞:用户进程发起一个IO操作请求后,必须等待IO操作完成后,用户进程才能继续运行后续操作,否则用户进程阻塞等待。

同步非阻塞:用户进程发起一个IO操作请求后可以返回做其它事情,但是用户进程需要不时询问 IO操作是否已经就绪,这里会造成不必要的CPU资源浪费。

异步非阻塞:用户进程发起一个IO操作请求后可以立即返回做其它事情,等到IO操作真正完成后,应用程序会收到IO操作完成的通知,此时用户进程只需要对数据进行处理即可。

今天把NIO、AIO的相关知识点总结完成,最后又将BIO、NIO、AIO进行区别总结,流的基本知识就讲到了这里,期待更加深入的学习!同时对之前学过的知识再进行复习巩固,加强练习锻炼。加油!!!

NIO、AIO概述总结相关推荐

  1. 关于BIO | NIO | AIO的讨论

    关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  2. Netty序章之BIO NIO AIO演变

    Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...

  3. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

  4. 也谈BIO | NIO | AIO (Java版--转)

    http://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BI ...

  5. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章

    来源:编程新说 网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTT ...

  6. IO: BIO ? NIO ? AIO?

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  7. 内核aio_今天来说说令人让人傻傻分不清的BIO,NIO,AIO

    | 作者:新一. | 简书:https://www.jianshu.com/u/b3263fc54bce | 知乎:https://www.zhihu.com/people/qing-ni-chi-y ...

  8. bio阻塞的缺点_java 中的 BIO/NIO/AIO 详解

    java 的 IO 演进之路 我们在前面学习了 linux 的 5 种 I/O 模型详解 下面我们一起来学习下如何使用 java 实现 BIO/NIO/AIO 这 3 种不同的网络 IO 模型编程. ...

  9. Java的IO:BIO | NIO | AIO

    原文: http://my.oschina.net/bluesky0leon/blog/132361 BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  10. Java IO(BIO, NIO, AIO) 总结

    文章转载自:JavaGuide 目录 BIO,NIO,AIO 总结 同步与异步 阻塞和非阻塞 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 ...

最新文章

  1. python生成递增序列_Python的6种内建序列之通用操作
  2. html中两行三列怎样写,html – Flexbox 3 divs,两列,一列有两行
  3. 你真的了解Scrum吗?
  4. 接口结构_适用于Mac系统的API接口调试应用
  5. U-BOOT的目录结构
  6. 集群中的session共享存储 实现会话保持
  7. JAVA蓝桥杯:高精度算法
  8. 人脸检测(八)--HOG特征原理及实现
  9. oj 26319 最大子序和
  10. 荷兰国旗问题+快速排序
  11. RPL协议的原理与安全机制
  12. [bzoj4453]cys就是要拿英魂!
  13. 【Python之numpy库】15.np.set_printoptions(suppress=True) 将数组科学计数法转化为浮点数
  14. Python中随机数种子的作用及使用
  15. MD5 标准算法详解
  16. 行内和块级元素区别?如何让行内元素设置宽高?
  17. 四个特性,让这个信创文件安全传输软件备受客户青睐
  18. 面试官问“为什么应聘这个岗位”,应该如何回答?
  19. 后台模板vue-admin-template的安装
  20. Python销售管理系统

热门文章

  1. 小米笔记本用来开发java_小米笔记本 Pro用来编程怎么样?
  2. 阿里云ACP考试模拟试题(2)
  3. bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘
  4. 浅谈AS2 传输/连接
  5. 成为智者的四个敌人——唐望
  6. android开发 java.lang.IllegalStateException at android.media.MediaPlayer._prepare(Native Method)
  7. 接口文档应该如何编写
  8. 闭包,何为闭包?如何解决闭包? (最全面解释)
  9. mysql数据库有关教程
  10. 笔记-Java基础语法-二进制