Java IO流
IO就是Intput和Output也就是输入输出,将数据输入到计算机内存的过程叫做输入,从内存读取出来的数据叫做输出。Java的IO流总共有40多个类,他们都是由下个4个抽象类派生出来的,InputStream和Read和OutputStream和Writer。
IO里使用的设计模式
装饰器模式
装饰器(Decorator)模式可以字啊不改原有对象的情况下进行扩展,装饰器模式是通过组合来替换继承来扩展原始类的功能,在继承非常法则的场景下这个设计模式是非常实用的,在IO流中他们的继承关系就是非常的复杂,所有在IO流中使用了装饰器模式。
FilterInputStream和FilterOutputStream对应输入流和对应输出流都是我们装饰器模式的核心,分别用于增强自累InputStream和OutputStream子类对象的功能。
适配器模式
适配器模式Adapter pattern模式主要用于接口互相不兼容的类的协调工作,在适配器模式中,**被适配的对象叫做适配者(Adaptee),作用于适配者的对象叫做适配器(Adapter)**类适配器用继承的关系实现,对象适配器使用组合关系来实现。
在我们IO流中字符流和字节流的接口不同,他们之间的协调工作就是使用适配器来实现,准确点来说是对象适配器,通过适配器我们可以将一个字节流对象适配成一个字符流对象,这样我们就可以通过字节流对象来读取和写入了。
我们的inputstream和outputstream的子类就是适配者,Inputstreamreader和outputstreamwriter就是适配者。
工厂模式
在我们的NIO中就大量使用了工厂模式,比如我们的newInputStream方法用于创建INputStream对象,就是用了静态工厂。
观察者模式
NIO中的文件目录舰艇就是用了观察者模式,**NIO中的文件目录监听服务基于watchservice接口和watchble接口。**WatchService属于观察者,watchble属于被观察者。
BIO
BIO就是同步堵塞IO模型,当程序发起read调用后,会一直堵塞,知道内核吧数据拷贝到用户空间。如果我们并发特别高BIO就显然没有优势了
NIO
NIO就是我们的同步非堵塞IO模型,当我们application发起read调用,等待数据从内核空间拷贝到用户空间这段时间里,县城依然是堵塞的,知道内核数据拷贝到用户空间,
我们的BIO和NIO比较,我们的NIO通过轮训操作避免了一只堵塞。当然这么做是十分消耗CPU的这时候我们的多路复用IO就来了。IO多路复用模型中,县城首先发起select调用,首先询问数据是否准备就绪,如果内核吧数据准备好了,用户就发起read调用(数据从内核空间读取到用户空间)这段区间还是堵塞的。
IO多路复用模型系统调用有select 还有epoll,
select是内核提供系统的调用他支持一次查询多个系统调用的可用状态。
epoll调用是linux2.6他相当于select的增强版本,对selcet进行了io执行效率优化
IO多路复用模型就是通过减少无效的系统调用减少了对CPU资源的消耗,在Java中的NIO中有一个非常重要的选择器概念,也被称为多路复用器,通过它,一个线程可以管理多个客户端的链接,当客户端数据到了之后才为他服务。
简单来说NIO就是通过我们选择器监听多个通道,非堵塞,处理完成后就返回。