设为首页 - 加入收藏 潍坊站长网 (http://www.0536zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 2018 2019 redis 建设
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

架构师知识储备——深入理解BIO、NIO、AIO

发布时间:2019-10-20 14:46 所属栏目:[优化] 来源:咔咔侃技术
导读:本文你将获取到:同/异步 + 阻/非阻塞的性能区别;BIO、NIO、AIO 的区别;理解和实现 NIO 操作 Socket 时的多路复用;同时掌握 IO 最底层最核心的操作技巧。 BIO、NIO、AIO 的区别是什么? 同/异步、阻/非阻塞的区别是什么? 文件读写最优雅的实现方式是什么? N

本文你将获取到:同/异步 + 阻/非阻塞的性能区别;BIO、NIO、AIO 的区别;理解和实现 NIO 操作 Socket 时的多路复用;同时掌握 IO 最底层最核心的操作技巧。

  • BIO、NIO、AIO 的区别是什么?
  • 同/异步、阻/非阻塞的区别是什么?
  • 文件读写最优雅的实现方式是什么?
  • NIO 如何实现多路复用功能?

带着以上这几个问题,让我们一起进入IO的世界吧。

架构师知识储备——深入理解BIO、NIO、AIO

在开始之前,我们先来思考一个问题:我们经常所说的“IO”的全称到底是什么?

可能很多人看到这个问题和我一样一脸懵逼,IO的全称其实是:Input/Output的缩写。

一、IO 介绍

我们通常所说的 BIO 是相对于 NIO 来说的,BIO 也就是 Java 开始之初推出的 IO 操作模块,BIO 是 BlockingIO 的缩写,顾名思义就是阻塞 IO 的意思。

1.1 BIO、NIO、AIO的区别

BIO 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。

NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。

AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

1.2 全面认识 IO

传统的 IO 大致可以分为4种类型:

  • InputStream、OutputStream 基于字节操作的 IO
  • Writer、Reader 基于字符操作的 IO
  • File 基于磁盘操作的 IO
  • Socket 基于网络操作的 IO

java.net 下提供的 Scoket 很多时候人们也把它归为 同步阻塞 IO ,因为网络通讯同样是 IO 行为。

java.io 下的类和接口很多,但大体都是 InputStream、OutputStream、Writer、Reader 的子集,所有掌握这4个类和File的使用,是用好 IO 的关键。

1.3 IO 使用

接下来看 InputStream、OutputStream、Writer、Reader 的继承关系图和使用示例。

1.3.1 InputStream 使用

继承关系图和类方法,如下图:

架构师知识储备——深入理解BIO、NIO、AIO

InputStream 使用示例:

  1. InputStream?inputStream?=?new?FileInputStream("D:\\log.txt");?
  2. byte[]?bytes?=?new?byte[inputStream.available()];?
  3. inputStream.read(bytes);?
  4. String?str?=?new?String(bytes,?"utf-8");?
  5. System.out.println(str);?
  6. inputStream.close();?

1.3.2 OutputStream 使用

继承关系图和类方法,如下图:

架构师知识储备——深入理解BIO、NIO、AIO

OutputStream 使用示例:

  1. OutputStream?outputStream?=?new?FileOutputStream("D:\\log.txt",true);?//?参数二,表示是否追加,true=追加?
  2. outputStream.write("你好,老王".getBytes("utf-8"));?
  3. outputStream.close();?

1.3.3 Writer 使用

Writer 继承关系图和类方法,如下图:

架构师知识储备——深入理解BIO、NIO、AIO

Writer 使用示例:

  1. Writer?writer?=?new?FileWriter("D:\\log.txt",true);?//?参数二,是否追加文件,true=追加?
  2. writer.append("老王,你好");?
  3. writer.close();?

1.3.4 Reader 使用

Reader 继承关系图和类方法,如下图:

架构师知识储备——深入理解BIO、NIO、AIO

Reader 使用示例:

  1. Reader?reader?=?new?FileReader(filePath);?
  2. BufferedReader?bufferedReader?=?new?BufferedReader(reader);?
  3. StringBuffer?bf?=?new?StringBuffer();?
  4. String?str;?
  5. while?((str?=?bufferedReader.readLine())?!=?null)?{?
  6. ?bf.append(str?+?"\n");?
  7. }?
  8. bufferedReader.close();?
  9. reader.close();?
  10. System.out.println(bf.toString());?

二、同步、异步、阻塞、非阻塞

上面说了很多关于同步、异步、阻塞和非阻塞的概念,接下来就具体聊一下它们4个的含义,以及组合之后形成的性能分析。

2.1 同步与异步

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章