Java中的IO流分为几种、BIO,NIO,AIO有什么区别

Java 专栏收录该内容
60 篇文章 0 订阅

目录

一、Java中的IO流分为几种、BIO,NIO,AIO有什么区别

1、Java中的IO流分为几种

为什么有了字节流还要有字符流:

2、BIO、NIO、AIO有什么区别

BIO(Blocking I/O):低负载、低并发

NIO(Non-blocking/New I/O):高负载、高并发

AIO(Asynchronous I/O):异步IO,应用不广泛

适用场景分析:


一、Java中的IO流分为几种、BIO,NIO,AIO有什么区别

1、Java中的IO流分为几种

JavaIO流分为两种,一种是字节流,一种是字符流,由四个抽象类(输入和输出)极其子类实现,四个抽象类分别是:InputStreamOutputStreamReaderWriter

为什么有了字节流还要有字符流:

本质上来讲,无论是文件读写还是网络发送接收,信息的最小存储单元是字节,那为什么要分为字节流和字符流呢?

答:字符流是由Java虚拟机将字节流转换得到的,问题就在于这个过程还算非常耗时,并且在不知道编码类型的时候容易出现乱码问题,所以I/O流干脆自己提供一个直接操作字符串的接口,方便我们平时对字符的操作;

字符流和字节流是根据处理数据的不同进行区分的;

字节流:适合操作图片、音视频文件等;

字符流:适合操作文本;

 

2、BIO、NIO、AIO有什么区别

BIO(Blocking I/O):低负载、低并发

BIO是一种同步阻塞I/O模型,数据的读取和写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的I/O,并且编程模型简单,也不用过多考虑系统的负载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是当面对十万甚至百万级的连接时,传统的BIO模型是无能为力的,因此我们需要一种更高效的I/O来应对更高的并发量;

 

NIO(Non-blocking/New I/O):高负载、高并发

NIO是一种同步非阻塞I/O模型,同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理;JDK1.4引入NIO框架,对应java.nio包,提供了Channel、Selector、Buffer等抽象,支持面向缓冲的,基于通道的I/O操作方法;

参考:NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。

 

AIO(Asynchronous I/O):异步IO,应用不广泛

异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理;

参考:AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。

 

适用场景分析:

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解;

  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持;

  • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持;

展开阅读全文
  • 0
    点赞
  • 2
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页

打赏

訾博ZiBo

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值