java中的NIO,BIO,AIO

10 篇文章 0 订阅

IO,input和output,Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

IO是什么?为什么需要IO?

java在1.4之前,提供的是BIO,也就是java.io包下的的东西,同步阻塞。
在1.4之后,提供了NIO(New IO),在java.nio包下,同步非阻塞。
在java7,提供了AIO,也在java.nio.channels包下,只不过新增了几个异步通道,异步非阻塞。

IO是啥

Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的。
在这里插入图片描述

可以看出来,IO主要是读写东西用的,至于读写的东西从哪来到哪去,并无具体限制,所以,我们可以从文件读:FileInputStream,可以从管道读:PipedInputStream等等。

没有IO会影响什么?

我是这么理解的,没有IO的java,相当于一个不能和外界沟通的程序,我们编写一个java程序,一般都需要输入输出,而IO就是帮助我们来和程序进行交互的通道,我们在键盘上的输入通过IO传输给程序,程序的输出通过显示屏展示给我们。
没有IO,java程序也就不可能做到网络编程,只能单机自己玩,因为它无法和其他程序进行通信。

IO可以用来做什么?

  • 读写文件
  • 接口调用
  • 数据输出
  • 网络IO通信

Tomcat和Jetty与IO啥关系

tomcat6默认就使用的BIO,而且也只有BIO。
tomcat7和tomcat8都开始支持APR模式(简单理解,就是利用JNI从操作系统级别解决异步IO问题,大幅度的提高服务器的处理和响应性能,也是Tomcat运行高并发应用的首选模式。),但是观察源码就会发现,tomcat7在没有APR配置的情况下会选择BIO。tomcat8在没有检测到APR配置的情况下会选择NIO。
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。 NIO是一个基于缓冲区、并能提供非阻塞I/O操作的Java API。适用于连接数目多且连接比较短(轻操作)的架构。 AIO(NIO2)方式使用于连接数目多且连接比较长(重操作)的架构,充分调用OS参与并发操作,编程比较复杂。
tomcat8开始支持APR利用JNI调用本地API,大幅度提高了tomcat的IO性能,是tomcat的“大杀器”,但是如果要使用APR就要安装对应 的组件。

Jetty一开始也使用的BIO,随着版本更新升级了NIO,

socket和IO啥关系

我是这样理解的,IO是socket实现的一部分,socket负责把数据从别处取过来,IO负责读取过来的数据,而且一般讨论socket和IO,这个IO会是指linux的IO,而不是java的IO,毕竟java的IO其实也只是封装了linux的IO。
供参考:Linux常见IO模型
BIO,NIO,AIO都有相对应的socket实现。
不过这篇文章和我的理解有出入,我再研究下:AIO Socket 编程 原理篇

连接数据库和IO有关系吗?

java中,连接数据库一般都是用jdbc,jdbc的底层进行连接使用socket,socket一般都是阻塞IO,也就是BIO。
but,java13的时候
NioSocketImpl
但是我还没研究清楚,这算不算是使用了NIO。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盖丽男

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值