一套是input/output stream 体系,一套是reader/writer体系,两者的区别是
stream负责的是字节流的数据,reader/writer负责的是字符流。
该模式主要用于在不改变已有的component设计和代码的情况下,不断的增加附属功能。打个比喻,就像你有一副画,为它配一个或者多个不同的画框。
具体可以参考这里:http://www.cnblogs.com/bastard/archive/2012/02/02/2336150.html
componnet要支持decorator的基本接口才行,这是设计时必须要做的。
两套IO 体系都是典型的decorator模式。下面的文章是介绍的比较好的。
http://my.oschina.net/gao0516/blog/136103
该模式用于将一个对象转换成另一个对象能用使用的接口。两种体系内部均有这样的实现。同时两种模式互相联通也依赖这种模式。主要是两个类:
InputStreamReader和OutputStreamWriter
从名字都可以看出来,既有stream又有reader/writer, 典型跨体系adapter。
举个例子,如果想用writer写文件,代码如下:
static private void test2() {
try {
PrintWriter printWriter = new PrintWriter("/home/dean/test2.log");
printWriter.println("hello, 中国");
printWriter.flush();
printWriter.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}但是有一个问题,PrintWriter的构造函数不接受append选项,因此每次都是将文件清除后重新写,不能支持追加写。而stream体系里面支持。因此这里采用adapter模式来混用使用两种体系。
static private void test1() {
try {
Writer w = new OutputStreamWriter(new FileOutputStream("/home/dean/test1.log", true), "UTF-8");
PrintWriter printWriter = new PrintWriter(w);
printWriter.println("hello, 中国");
printWriter.flush();
printWriter.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}所以看上去reader/writer体系功能侧重于文本字符处理,而对一些流操作的高级功能,还是要依赖stream体系的配合。
原文:http://blog.csdn.net/csfreebird/article/details/44705765