锁定老帖子 主题:最好的java io包解密
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-14
发信人: hzxdark (漆黑之翼), 信区: Java
标 题: java.io包详细解说,希望对师弟师妹们有所帮助^_^ 发信站: 荔园晨风BBS站 (Thu Dec 21 23:13:30 2006), 站内 我不知道各位是师弟师妹们学java时是怎样的,就我的刚学java时的感觉,java.io包是最让我感到一头雾水的。所以现在这篇文,尽可能简单地描述java.io包的结构,希望对java.io同样一头雾水的师弟师妹们有些帮助^_^ 我开始学java时,java.io的介绍是在《java编程思想》里看的。说实话,当时完全看不明白——“java.io的是用‘decorator模式’来构建的”——刚学java时,天知道啥玩意叫decorator…… 不过要明白java.io,确实需要理解decorator设计模式,下面详细介绍下。 所谓decorator,装饰,其实可以说是一种设计的技巧,说白了没什么难的,别看很多网上资料说的天花乱坠的(非常讨厌有些文章总是把简单的问题描述得跟两头猪的kiss问题一样复杂……)。 decorator的结构如下: MyInterface | _______|_______ | | Myclass Decorator ____|_____ | | DecoratorA DecoratorB decorator的目的是在不改变任何原有的类的基础下,添加新的功能(你可以理解为书上说的灵活性)。其中Myclass是你要扩展的类,DecoratorA跟DecoratorB封装了你要扩展的功能,并保存有一个MyInterface的引用。 考虑以下代码: public static void main(Strings[] arg){ myInterface a = new myClass(); a.print(); } myInterface 是myClass的接口,只声明了一个方法print(),myClass实现了该方法: public void print(){ System.out.println("hello"); } 那么假如我们要在不改变原来的myClass的基础上,变成输出“hello world!”,要怎么做呢? 当然我们可以考虑直接写个myClass的子类,helloClass之类,但是要是要求根据环境不同,输出"hello world!",my hello world","my Hello"之类的组合呢? 用继承的方式将不得不写一堆类似的子类来。 decorator,装饰模式的解决方法是,只实现基本的功能,把附加的功能抽出来放一边。 例如以下代码: class DecoratorA implements Decorator{ MyInterface myObject; DecoratorA(myInterface myObject){ this.myObject = myObject; } public void print(){ myObject.print(); System.out.print("world!"); } } class DecoratorB implements Decorator{ MyInterface myObject; DecoratorA(myInterface myObject){ this.myObject = myObject; } public void print(){ System.out.print("my"); myObject.print(); } } DecoratorA和DecoratorB的功能分别是打印出world跟my。这时main函数要打印出my hello world可简单变为: public static void main(Strings[] arg){ MyInterface a =new DecoratorA(new DecoratorB(new MyClass()); a.print(); } 简单吧?简单的说,就是: print(){ print("xxx");//可替换成你要添加的任何处理; myObject.print();//调用基础类的函数; xxxx; //后续处理 } Decorator的介绍就到此为止,接下来讲java.io. 看到 MyInterface a =new DecoratorA(new DecoratorB(new MyClass()); 是不是觉得眼熟咧?这跟 BufferedInputStream bis = new BufferedInputStream(new DataInpuStream(new FileInputStream("xxx.txt"))); 是不是很像? (画外音加一个臭鸡蛋扔上来:因为java.io就是用decorator模式组织的,当然像啦……) java.io分Stream跟reader、writer两大类,这里只详细介绍Stream,并最后两者间的关系。Stream又分inputStream、OutputStream,两者基本是对称的,这里也只介绍InputStream. java.io.InputStream | _______________________|________________________ | | ByteArrayInputStream FilterInputStream StringBufferInputStream _____________________|____________________________ FileInputStream | | | | PipedInputStream DataInputStream BufferedInputStream LineNumInpuStream XXX (注:xxx是PushbackInputStream,上面的图放不下) 这个图跟最初介绍的hello world的图很像吧?呵呵。 基础的流只有左边4个,这些流代表了数据的来源,所有的流都必须从这四个中之一开始。(注,还有一个RandomAccessFile、File,这两个不在本文介绍范围)。 然后当我们需要什么添加功能,就从右边中选择一个装饰。例如,我们需要缓存功能,那么需要bufferedInputStream装饰: BufferdInputStream is = new BufferedInputStream(new FileInputStream("xxx.txt")); 假如再要DataInputStream的功能,只要在加一层: DataInputStream dis = new DataInputStream(new BufferdInputStream(new FileInputStream)); (厄,我不甚明白这个类添加的功能是做什么用的,资料说是增加读取java原生数据的功能,不甚明白,有清楚的来补充一下,pipeInputStream跟sequenceInputStream也没用过,欢迎补充说明) 这里你可以想象成,在基本的FileInputStream.readxxx()方法在BufferedInputStream的readxxx()方法调用,并添加相应的处理。 最后说说InputStream跟reader的区别: 老实说,我只知道一个支持字节流,一个支持unicode流,除此之外有啥米性能上的不同我还真不知道,哈哈。知道的快来补充补充~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-09-15
專業jf...
|
|
返回顶楼 | |
发表时间:2010-09-15
对decorator的例子很易懂
|
|
返回顶楼 | |
发表时间:2010-09-15
Stream是字节流,Reader是字符流,一个是按字节读取的,一个是按字符读取的。
|
|
返回顶楼 | |
发表时间:2010-09-15
不错!程序文章就应该些的通俗易懂,真正理解了才能做到代码简洁,说的出,让人能听的懂!
|
|
返回顶楼 | |
发表时间:2010-09-15
荔园晨风?貌似是深大的BBS吧?
|
|
返回顶楼 | |
发表时间:2010-09-15
写得不错, 通俗易懂
|
|
返回顶楼 | |
发表时间:2010-09-15
有个BUG
class DecoratorB 中构造函数应该是 DecoratorB,不是DecoratorA,,,吧 |
|
返回顶楼 | |
发表时间:2010-09-15
以前不是有人发过吗。。而且“最好”也过分了
|
|
返回顶楼 | |
发表时间:2010-09-15
这是标准的平民教程
|
|
返回顶楼 | |