posts - 262,  comments - 221,  trackbacks - 0
          【一】Apache commons IO包之FilenameUtils

          在使用JDK的File類構(gòu)建目錄、文件對象時,通常會碰到以下的問題:

           ①分隔符的問題:Unix系統(tǒng)和Windos系統(tǒng)的路徑分隔符、換行符不同
           ②路徑規(guī)范的問題:有些API對于返回的目錄路徑不帶"/",有些則有
           ③文件名規(guī)范的問題:有些文件名中間帶有空格,導(dǎo)致程序解析錯誤

          上面的問題雖然不算復(fù)雜,卻也惱人。有時候甚至?xí)谶@些問題上耗費大量的時間。于是Apache commons io包提供了一個FilenameUtils類來專門幫助我們解決這樣的問題。根據(jù)Apache common io的說法:你可以通過使用JDK自帶的File類構(gòu)造方法File(String parent, String child)來避免使用這個類,但是實際上這個類還是很有用的!

          【二】Apache commons IO包中對路徑的定義

          要了解Apache commons IO包如何處理路徑文件名的問題,首先要知道Apache中如何定義關(guān)于路徑的參數(shù):

          關(guān)于路徑有3個概念:
           ①前綴:盤符或者根目錄
           ②路徑:從前綴或根目錄開始直至文件的所在目錄
           ③全路徑:包含了前綴和路徑

          要注意的是:在Apache的所以關(guān)于路徑的概念中,都是以分隔符結(jié)尾的。因為按照Apache的說法,如果沒有提供分隔符,它將不能正確地識別路徑代表的是一個目錄還是一個文件,在這種情況下只能選擇將其識別為一個文件。

          關(guān)于文件名也有3個概念:
           ①基本名稱:不包含路徑和擴(kuò)展名的部分
           ②擴(kuò)展名稱:從.開始直至結(jié)束的部分
           ③文件名稱:包含了基本名稱和擴(kuò)展名稱

          要注意的是:擴(kuò)展名并不包含"."

          在路徑概念中,前綴是一個很重要的概念:因為它告訴了程序應(yīng)該從那里開始識別,在Apache commons IO包中,使用如下規(guī)則去獲取前綴:


          【三】常用API

          ①路徑規(guī)范

          首先要介紹的就是normalize方法,這個方法用于對各種類型的路徑進(jìn)行規(guī)范,它的規(guī)則如下:

          A trailing slash will be retained.
          A double slash will be merged to a single slash (but UNC names are handled).
          A single dot path segment will be removed.
          A double dot will cause that path segment and the one before to be removed.
          If the double dot has no parent path segment to work with, null is returned


          下面是官網(wǎng)上面的一個例子:


          要特別注意的是:這個方法總是會返回一個結(jié)尾帶有"/"的路徑,如果你不需要這個分隔符,那么你可以調(diào)用另外一個方法:normalizeNoEndSeparator(String filename)。

          ②路徑的比較

          有點時候我們需要比較兩個路徑是否代表了同一個資源,但是由于路徑寫法或者API調(diào)用的不同,即便同一個對象也有可能返回false的結(jié)果。于是Apache提供了一個直接簡便的方法:equals。這個方法的完整簽名是:

           static boolean equals(String filename1, String filename2,
                                         boolean normalized, IOCase caseSensitivity)

          其中normalized參數(shù)表示在比較前是否要進(jìn)行規(guī)范,通常都是true,參數(shù)caseSensitivity表示是否大小寫敏感。這個參數(shù)有3個可選擇的選項,他們分別是:
           ※ IOCase.INSENSITIVE
           ※ IOCase.SENSITIVE
           ※ IOCase.SYSTEM

          通常為了移植性我們都會選擇IOCase.SYSTEM,即根據(jù)系統(tǒng)的類型自動決定。

          ③路徑獲取

          分為path和full path兩種情況,可用的API有:

           ※ getFullPath(String filename)/getFullPathNoEndSeparator(String filename)
           ※ getPath(String filename)/getPathNoEndSeparator(String filename)
           
          ④路徑的截取

          包含了對擴(kuò)展名的位置判斷和分隔符的位置判斷。設(shè)想一下假如現(xiàn)在有這樣的一個路徑:C:/path/my.file/you.txt

          如果我們要獲取擴(kuò)展名,使用indexOf('.'),那么返回的將是錯誤的結(jié)果。使用Apache commons IO提供的indexOfExtension(String filename)方法,將會首先檢查在"."后是否還有"/"分隔符。

          該方法內(nèi)部默認(rèn)調(diào)用了另外一個方法:indexOfLastSeparator(String filename)

          ⑤文件名的獲取

          分為全文件名,基本文件名,擴(kuò)展名。可用的API有:

           ※ getName(String filename)
           ※ getBaseName(String filename)
           ※ getExtension(String filename)


          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2010-03-08 10:56 Paul Lin 閱讀(857) 評論(0)  編輯  收藏 所屬分類: J2SE
          <2010年3月>
          28123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 丰台区| 台湾省| 思茅市| 古浪县| 孝昌县| 周至县| 莱西市| 方城县| 郁南县| 吉木乃县| 汝阳县| 吉安县| 上思县| 曲靖市| 开封县| 靖安县| 镇宁| 两当县| 浪卡子县| 阳东县| 大同市| 泾川县| 新建县| 花莲市| 嘉黎县| 襄樊市| 大安市| 洪雅县| 黄骅市| 剑河县| 厦门市| 金堂县| 苏尼特右旗| 庄浪县| 土默特左旗| 潢川县| 达尔| 杂多县| 长白| 阿合奇县| 新兴县|