`
hzxdark
  • 浏览: 77194 次
社区版块
存档分类
最新评论

java.io包详细解说

阅读更多
发信人: 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流,除此之外有啥米性能上的不同我还真不知道,哈哈。知道的快来补充补充~





--


风中云,水中鱼,人道是,天涯海角任逍遥;
叶飘零,雨叮咛,可怜那,云心雨泪谁人知?
分享到:
评论
12 楼 Redpick13 2013-04-13  
好人,好人,你们都是好人
11 楼 zc741520 2012-12-03  
讲的好,收录了!
10 楼 zyq8557 2012-07-13  
大侠子 写道
kingtoon 写道
例子不错,但是楼主忘记说明一点:需要让被装饰者进入装饰者中.

我是这样实现的
public interface Decorator extends MyInterface



这个说的没错,不然没法实现!
9 楼 zyq8557 2012-07-13  
很受用,比那些咬文嚼字的文章强多了,就是需要这样的文章!能把一个复杂的东西用最简单的方式表达出来,才是牛X的!就像爱因斯坦解说他的相对论一样!
8 楼 大侠子 2012-05-02  
kingtoon 写道
例子不错,但是楼主忘记说明一点:需要让被装饰者进入装饰者中.

我是这样实现的
public interface Decorator extends MyInterface


7 楼 kingtoon 2011-12-15  
例子不错,但是楼主忘记说明一点:需要让被装饰者进入装饰者中.

我是这样实现的
public interface Decorator extends MyInterface
6 楼 kingtoon 2011-12-15  
5 楼 ipjmc 2011-11-17  
  通俗易懂
4 楼 mails2008 2011-10-10  
Reader是面向字符的,
stream是二进制文件,字节为单位读取。
3 楼 xueyunji1989 2011-08-08  
怎么觉得decorator有点像AOP了。

业务逻辑前后加自己的逻辑处理。
2 楼 alvinsong 2011-07-26  
不错的文章,先看看
1 楼 guoping007 2007-08-09  
javadoc某些话的确比较高深

相关推荐

Global site tag (gtag.js) - Google Analytics