JAVA IO裝飾者模式:java
不知道你們在學JAVA IO的時候,有沒有被各類五花八門的構造函數之間的組合和嵌套弄得頭昏腦漲,好比BufferedReader br=new BufferedReader(new InputStreamReaderweb
(new FileInputStream(filename),"UTF-8"));與其去記這些函數,不如來看下面一段話。正則表達式
先來看一幅圖:編程
這是一個簡單的JAVA輸入輸出流的類層次結構圖。api
咱們知道,Reader類InputStream類是不能直接被實例化的,只能實例其子類(或其子類的子類…),Reader類和InputStream類裏只封裝了一些IO所必須的抽象方法,具體實現和怎麼實現則直接由其子類所定義,這些直接子類分別直接搭建了從文件到程序的管道(不一樣子類有不一樣管道),管道里面就是具體的流,而這些子類派生出來的子類則對這些管道進行了改進,或直接對管道自己進行改良,或在管道和程序之間再架設一個緩衝區,這就是JAVA IO的裝飾者模式。微信
再來看上面的代碼,最裏面的new FileInputStream(filename)搭建了一個從文件到程序的管道,第一個參數是文件名,能夠是像「test.txt」這樣的相對路徑(這樣文件就存放在工程根目錄下),也能夠是像」 E:\JAVA Src\homework「這樣的絕對路徑,不過推薦使用相對路徑,一來方便本機文件的管理,二來方便移植給別人。 app
再來看次外層的new InputStreamReader(newFileInputStream(filename),"UTF-8"),先說說第二個參數,設置字符集,通常設置爲「UTF-8‘,爲國際通用標準,至於第一個參數,先看一下InputStreamReader的構造函數.編程語言
這裏咱們用的是第四個構造函數,它的第一個參數爲一個InputStream對象,而咱們傳入的是FileInputStream,這裏使用了多態技術,莫方,問題不大,關於多態只須要記住下面這句話,「多態的核心:父類引用能夠指向子類的對象。「,從上面的繼承樹能夠看出FileInputStream類正是InputStream類的子類,而調用時,InputStream in = new FileInputStream(filename),等號後面是咱們傳入的子類對象,等號前面是一個父類的應用,因此,多態沒問題了吧?再從宏觀上來看,new InputStreamReader函數
(new FileInputStream(filename),"UTF-8"),把一個字節流轉換成了字符流,對管道自己作改良:把運字節的管道改爲了運字符的管道,這就是JAVA IO修飾者模式的體現。 再來看最外層的BufferedReader br=new BufferedReader(new InputStreamReader工具
(new FileInputStream(filename),"UTF-8")),分析方法同次外層,這裏在管道和程序之間又架設了一個緩衝區,也是JAVA IO修飾者模式的體現。
因此,這些東西都不用記了,使用的時候查JAVA API就行。
在此附上一個無毒無害的JAVA 在線API工具
http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4
封裝一個JAVA IO操做工具
在學io的時候,常常遇到讀寫數字和字符串的,好比從一大堆包含數字和字符串的txt文件裏提取數字,,裏面還有各類不可見字符…,個人思路是,寫的時候所有把數據轉成字符串,而後利用字符流再寫,讀的時候用字符流讀,再利用String類強大的API進行數據分割(其實在JAVA高編裏有現成的正則表達式能夠了解下,限於學習成本,這裏直接用本身設計的模型)
先來看寫數據,好比,要寫一段這樣的數據:「中南大學\r\n通訊工程1602班\r\n0905160233「
//作下說明
/**
* 在大多數編程語言中,從鍵盤上輸入的回車等效於兩個字符'\r'+'\n'
* 'r':回到行首;'n':新起一行
* 這裏把content設置成這樣是爲了模擬文本編輯中換行操做
* 以及字符串和數字混合和分割的問題
*/
利用這樣一段代碼把它寫到文本文檔裏:
(說明一下爲何吧writefile()設置成static靜態, main()函數是靜態的,在靜態方法裏只能調用靜態方法或變量,若是不設置成static,這樣調用也行;:new 「YourClassName」().writefile(content,filename)打開txt文檔,以下:
下面再來看讀的操做,根據一個文件名讀取,並返回一個字符串
輸出打印以下:
而後提取數字:
用代碼System.out.println("班級編號:"+Numbers.get(0)+"\t學號:"+Numbers.get(1));打印以下:
提取字符串等其餘操做相似,只要改一下判斷條件就行。
以上爲小編的原創做品
以爲寫得不錯,請點個贊
瞭解更多資料,請點個關注
後臺回覆「java io「獲取源代碼
本文分享自微信公衆號 - 月小水長(inspurer)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。