JAVA IO总结之JAVA IO概览

开始之前 

     搞软件很多年了,很少对自己掌握的知识进行梳理,虽然工作中遇到问题基本都能够进行有效解决,但有时候想想知识碎片化比较严重,于是决定今年开始进行一下知识的整理希望能让知识结构化。最近在重新认识NIO那么先从IO开始吧。

     JAVA IO,学习JAVA的人我想首先想到的是InputStream或Outputstream,我想大家认识IO应该都是从这里开始的吧。

五种IO模型

      开始之前先了解网络编程的五种IO模型,可能对我们整体认识JAVA IO会有帮助:

  •       blocking I/O(阻塞IO模型)

  •      此种IO模型也就是应用线程会阻塞知道数据到应用程序缓冲区也就是java 1.4之前的IO实现,早期的IO实现并不完善,所以基于阻塞IO实现的模式下,使用JAVA IO存在如下问题:
     1、性能较差:因为没有缓冲区,必须阻塞循环的去读取,造成CPU资源浪费。
     2、因是阻塞的模型,应用程序在网络传输中,容易出现IO阻塞,造成不必要的等等。
     3、支持的字符集有限,移植性较差。
     4、再高并发的场景,性能较差
  •       nonblocking I/O(非阻塞IO模型)

  •       此种IO模型简单来说,就类似我们写程序一个while循环,如果没有数据就返回一个EWOULDBLOCK这样可以进行其他操作,知道数据到了,就进行数据的拷贝。
  •      I/O multiplexing (IO复用模型)

  •       此种IO模型即NIO的模型基于poll/epoll(其中epoll使用事件驱动代替扫描,性能更高)实现,我们可以将一个或多个FD(File Descriptor在JAVA NIO中可以认为是channel)注册到selector,系统会阻塞在select操作上,这样select可以帮我们侦测哪些FD已经就绪,如果fd就绪就执行回调函数了。
  •      signal driven I/O (信号驱动IO)

  •      简单的讲,就是IO请求下发,系统返回,当IO已经就绪,系当数据就绪了,就发送一个SIGIO信号通知系统进行数据读取。
  •      asynchronous I/O (异步IO)

  •      系统告知内核执行IO操作,当IO操作完成病讲数据复制到用户自己的缓冲区后通知我们进行处理。也就是AIO的底层实现原理。

JAVA IO 概览

  JAVA IO从实现分为 BIO、NIO、NIO2.0(也就是AIO异步IO)。其中BIO也就是大家所熟知的阻塞IO了,说是阻塞IO,不过说是阻塞IO,实际上内部实现已进行了优化。阻塞IO存在较多的缺陷,在JAVA1.4 NIO正式发布他提供了很多异步IO开发的API和类库:

 进行异步IO的缓冲区ByteBuffer
 进行异步IO的管道Pipe
 进行各种IO操作的管道如ServerSocketChannel、SocketChannel、FileChannel、DatagramChannel等。
 多种字符集的编码能力和解码能力
 实现非阻塞IO的多路复用器
 基于Perl实现的正则表达式类库
新的NIO类,极大改进了IO的使用体验,但任然存在不足,主要问题有:
 没有统一的文件属性
 API能力较弱,例如目录的级联创建和递归遍历
 系统的部分高级API无法调用等
2011年JAVA 7发布,其较大改进之一就是对NIO进行了升级,被称为NIO2.0,提供了一下改进:
 批量获取文件属性的API,且与平台无关
 提供AIO,支持基于文件和异步网络的异步IO操作等。

JAVA BIO概览

JAVA IO类图

上图摘自:https://blog.csdn.net/zhaoyanjun6/article/details/54292148,其中ByteArrayReader 错了,应是CharArrayReader

NIO 


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

AIO

AIO 的底层实现是基于 asynchronous I/O 异步IO 当读取请求下发后主线程可以继续执行其他指令,如果IO读取完成,系统会调用回调函数继续执行剩余逻辑。

https://www.jianshu.com/p/c5e16460047b详细可参见,后续我写代码来演示NIO和AIO的文件操作。

本文先到此为止,现在发现要系统性的整理出知识还是很费力的,继续努力吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值