区别
一套是input/output stream 体系,一套是reader/writer体系,两者的区别是
stream负责的是字节流的数据,reader/writer负责的是字符流。
设计模式
decorator模式
该模式主要用于在不改变已有的component设计和代码的情况下,不断的增加附属功能。打个比喻,就像你有一副画,为它配一个或者多个不同的画框。
具体可以参考这里:http://www.cnblogs.com/bastard/archive/2012/02/02/2336150.html
componnet要支持decorator的基本接口才行,这是设计时必须要做的。
两套IO 体系都是典型的decorator模式。下面的文章是介绍的比较好的。
http://my.oschina.net/gao0516/blog/136103
adapter模式
该模式用于将一个对象转换成另一个对象能用使用的接口。两种体系内部均有这样的实现。同时两种模式互相联通也依赖这种模式。主要是两个类:
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()); } }
运行后,test2.log文件被创建,里面出现了hello,中国。
但是有一个问题,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()); } }
利用了FileOutputStream支持append特性,用OutputStreamWriter做adapter,现在可以了。
所以看上去reader/writer体系功能侧重于文本字符处理,而对一些流操作的高级功能,还是要依赖stream体系的配合。