Java IO兩大體系,javaio兩大
區別
一套是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體系的配合。