IO可算是jdk的一个很基本的东西了,所以打算整理一下我对IO的学习和理解。
IO,当然就是Input和Output的简写,分别代表了读和写两个方面。
流的引入,使我们可以形象的认为数据就像流水一般在各种是被间流走,而不必理会沟渠是怎么铺设的。我们只要关注怎么控制这些字节或者字符的流动就好了。
[size=medium][color=blue][b] InputStream & OutputStream[/b][/color][/size]
这两个类代表了字节流的输入和输出。他们是两颗大树的树根,就像一对夫妻一样,下面都有一群子孙。查看附图。
[size=medium][color=blue][b] 装饰模式 Decorator design pattern[/b][/color][/size]
在深入了解这些子类之前,得先了解一下装饰模式,jdk就是采用这种模式来设计这些子类的。装饰模式其实是解决组合问题的。举个例子,当你设计一种字体的时候,你可能需要为它设置颜色,大小,字体类型,动画特效等等。如果让你为每一种成型的样子设计一个类来表示,或者设计一个模板来生产,那可以说有无数种组合,你几乎是做不到的。那么我可以做到的就是设计几种装饰类,可以利用这些类来人任意的组合来为文字添加效果,这样就可以满足各种需求了。
回到对象设计上来说,就是动态的为对象添加新的功能和职责,期望他能在原来的基础上完成更多的或者更好的完成工作。这里关键就是一个动态的。因为通过继承你也可以为一个类扩展新的功能,但那时固定的。通过装饰模式可以对对象进行动态的包装,怎么包装用户使用的时候按需进行。你只要提供包装来就好了。
Java IO正是有这种多种特征相组合的需求。所以也就采用了这种设计模式。
那么怎么才能实现这种模式呢?
装饰器可以被看成是一种代理,当你要执行一个类的方法的时候,可以委托给这个类的装饰器去做,并且他会为你干点别的事情。所以装饰器得持有被装饰的对象引用,以调用他干最基本的事情,同时,还要在要提供附加功能的方法上添加点东西,以达到装饰的效果。
当然装饰器也可以提供更多的方法以满足更多的需要,但都得围绕被装饰的对象来扩展。
毕竟一种装饰器可能仅提供某一方面的装饰和增强,因此需要更多种装饰器来满足不同的需要。这些装饰器之间又可以相互装饰已达到组合出拳的效果。
既然如此,得有一个基类装饰器,来包含被装饰对象的所有方法和特性,别的装饰器都继承他,这样每个装饰器都只扩展自己想要扩展的方法,其他的就不必重写。不然,你要在所有的装饰器里面都得重写很多不需要修改的方法。
FilterInputStream & FilterOutputStream正是为此目的而设计,所有的装饰类都继承于这个抽象类。
[size=medium][color=blue][b]FilterInputStream & FilterOutputStream[/b][/color][/size]
FilterInputStream & FilterOutputStream分别继承于InputStream & OutputStream。并且提供了装饰器接口用来装饰被装饰对象。
[size=medium][color=blue][b]BufferedInputStream & BufferedOutputStream[/b][/color][/size]
不论你要读写的IO设备是什么,你总是需要缓存读写内容。想想看,为什么呢?一提到缓存基本都是为了解决瓶颈问题的,为了提高性能。相比内存的速度来说,IO设备就太慢了。所以就需要缓存来解决,把你要写的内容缓存起来,等待一个时机,就一次flush出去,完成批量的写。
[size=medium][color=blue][b] Reader & Writer[/b][/color][/size]
从jdk1.1开始来了一对新夫妇。这两个类代表了字符流的输入和输出。下面也有一群子孙(查看附图)。其实,这个家族的出现最主要的原因是为了国际化。也就是解决多语言的问题。因为InputStream&OutputStream主要处理8位字节的问题,不能很好的处理16位的unicode。unicode就是用来解决国际化问题的,这个家族支持unicode。
既然是这样,那么基本上这个家族都有和InputStream&OutputStream对应的子类,除了一些特殊的必须基于字节的子类。
[size=medium][color=blue][b]更新中...[/b][/color][/size]
IO,当然就是Input和Output的简写,分别代表了读和写两个方面。
流的引入,使我们可以形象的认为数据就像流水一般在各种是被间流走,而不必理会沟渠是怎么铺设的。我们只要关注怎么控制这些字节或者字符的流动就好了。
[size=medium][color=blue][b] InputStream & OutputStream[/b][/color][/size]
这两个类代表了字节流的输入和输出。他们是两颗大树的树根,就像一对夫妻一样,下面都有一群子孙。查看附图。
[size=medium][color=blue][b] 装饰模式 Decorator design pattern[/b][/color][/size]
在深入了解这些子类之前,得先了解一下装饰模式,jdk就是采用这种模式来设计这些子类的。装饰模式其实是解决组合问题的。举个例子,当你设计一种字体的时候,你可能需要为它设置颜色,大小,字体类型,动画特效等等。如果让你为每一种成型的样子设计一个类来表示,或者设计一个模板来生产,那可以说有无数种组合,你几乎是做不到的。那么我可以做到的就是设计几种装饰类,可以利用这些类来人任意的组合来为文字添加效果,这样就可以满足各种需求了。
回到对象设计上来说,就是动态的为对象添加新的功能和职责,期望他能在原来的基础上完成更多的或者更好的完成工作。这里关键就是一个动态的。因为通过继承你也可以为一个类扩展新的功能,但那时固定的。通过装饰模式可以对对象进行动态的包装,怎么包装用户使用的时候按需进行。你只要提供包装来就好了。
Java IO正是有这种多种特征相组合的需求。所以也就采用了这种设计模式。
那么怎么才能实现这种模式呢?
装饰器可以被看成是一种代理,当你要执行一个类的方法的时候,可以委托给这个类的装饰器去做,并且他会为你干点别的事情。所以装饰器得持有被装饰的对象引用,以调用他干最基本的事情,同时,还要在要提供附加功能的方法上添加点东西,以达到装饰的效果。
当然装饰器也可以提供更多的方法以满足更多的需要,但都得围绕被装饰的对象来扩展。
毕竟一种装饰器可能仅提供某一方面的装饰和增强,因此需要更多种装饰器来满足不同的需要。这些装饰器之间又可以相互装饰已达到组合出拳的效果。
既然如此,得有一个基类装饰器,来包含被装饰对象的所有方法和特性,别的装饰器都继承他,这样每个装饰器都只扩展自己想要扩展的方法,其他的就不必重写。不然,你要在所有的装饰器里面都得重写很多不需要修改的方法。
FilterInputStream & FilterOutputStream正是为此目的而设计,所有的装饰类都继承于这个抽象类。
[size=medium][color=blue][b]FilterInputStream & FilterOutputStream[/b][/color][/size]
FilterInputStream & FilterOutputStream分别继承于InputStream & OutputStream。并且提供了装饰器接口用来装饰被装饰对象。
[size=medium][color=blue][b]BufferedInputStream & BufferedOutputStream[/b][/color][/size]
不论你要读写的IO设备是什么,你总是需要缓存读写内容。想想看,为什么呢?一提到缓存基本都是为了解决瓶颈问题的,为了提高性能。相比内存的速度来说,IO设备就太慢了。所以就需要缓存来解决,把你要写的内容缓存起来,等待一个时机,就一次flush出去,完成批量的写。
[size=medium][color=blue][b] Reader & Writer[/b][/color][/size]
从jdk1.1开始来了一对新夫妇。这两个类代表了字符流的输入和输出。下面也有一群子孙(查看附图)。其实,这个家族的出现最主要的原因是为了国际化。也就是解决多语言的问题。因为InputStream&OutputStream主要处理8位字节的问题,不能很好的处理16位的unicode。unicode就是用来解决国际化问题的,这个家族支持unicode。
既然是这样,那么基本上这个家族都有和InputStream&OutputStream对应的子类,除了一些特殊的必须基于字节的子类。
[size=medium][color=blue][b]更新中...[/b][/color][/size]