【一】Apache commons IO包之FilenameUtils
在使用JDK的File類(lèi)構(gòu)建目錄、文件對(duì)象時(shí),通常會(huì)碰到以下的問(wèn)題:
?①分隔符的問(wèn)題:Unix系統(tǒng)和Windos系統(tǒng)的路徑分隔符、換行符不同
?②路徑規(guī)范的問(wèn)題:有些API對(duì)于返回的目錄路徑不帶"/",有些則有
?③文件名規(guī)范的問(wèn)題:有些文件名中間帶有空格,導(dǎo)致程序解析錯(cuò)誤
上面的問(wèn)題雖然不算復(fù)雜,卻也惱人。有時(shí)候甚至?xí)谶@些問(wèn)題上耗費(fèi)大量的時(shí)間。于是Apache commons io包提供了一個(gè)FilenameUtils類(lèi)來(lái)專(zhuān)門(mén)幫助我們解決這樣的問(wèn)題。根據(jù)Apache common io的說(shuō)法:你可以通過(guò)使用JDK自帶的File類(lèi)構(gòu)造方法File(String parent, String child)來(lái)避免使用這個(gè)類(lèi),但是實(shí)際上這個(gè)類(lèi)還是很有用的!
【二】Apache commons IO包中對(duì)路徑的定義
要了解Apache commons IO包如何處理路徑文件名的問(wèn)題,首先要知道Apache中如何定義關(guān)于路徑的參數(shù):
關(guān)于路徑有3個(gè)概念:
?①前綴:盤(pán)符或者根目錄
?②路徑:從前綴或根目錄開(kāi)始直至文件的所在目錄
?③全路徑:包含了前綴和路徑
要注意的是:在A(yíng)pache的所以關(guān)于路徑的概念中,都是以分隔符結(jié)尾的。因?yàn)榘凑誂pache的說(shuō)法,如果沒(méi)有提供分隔符,它將不能正確地識(shí)別路徑代表的是一個(gè)目錄還是一個(gè)文件,在這種情況下只能選擇將其識(shí)別為一個(gè)文件。
關(guān)于文件名也有3個(gè)概念:
?①基本名稱(chēng):不包含路徑和擴(kuò)展名的部分
?②擴(kuò)展名稱(chēng):從.開(kāi)始直至結(jié)束的部分
?③文件名稱(chēng):包含了基本名稱(chēng)和擴(kuò)展名稱(chēng)
要注意的是:擴(kuò)展名并不包含"."
在路徑概念中,前綴是一個(gè)很重要的概念:因?yàn)樗嬖V了程序應(yīng)該從那里開(kāi)始識(shí)別,在A(yíng)pache commons IO包中,使用如下規(guī)則去獲取前綴:
【三】常用API
①路徑規(guī)范
首先要介紹的就是normalize方法,這個(gè)方法用于對(duì)各種類(lèi)型的路徑進(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)上面的一個(gè)例子:
要特別注意的是:這個(gè)方法總是會(huì)返回一個(gè)結(jié)尾帶有"/"的路徑,如果你不需要這個(gè)分隔符,那么你可以調(diào)用另外一個(gè)方法:normalizeNoEndSeparator(String filename)。
②路徑的比較
有點(diǎn)時(shí)候我們需要比較兩個(gè)路徑是否代表了同一個(gè)資源,但是由于路徑寫(xiě)法或者API調(diào)用的不同,即便同一個(gè)對(duì)象也有可能返回false的結(jié)果。于是Apache提供了一個(gè)直接簡(jiǎn)便的方法:equals。這個(gè)方法的完整簽名是:
?static boolean equals(String filename1, String filename2,
?????????????????????????????? boolean normalized, IOCase caseSensitivity)
其中normalized參數(shù)表示在比較前是否要進(jìn)行規(guī)范,通常都是true,參數(shù)caseSensitivity表示是否大小寫(xiě)敏感。這個(gè)參數(shù)有3個(gè)可選擇的選項(xiàng),他們分別是:
?※ IOCase.INSENSITIVE
?※ IOCase.SENSITIVE
?※ IOCase.SYSTEM
通常為了移植性我們都會(huì)選擇IOCase.SYSTEM,即根據(jù)系統(tǒng)的類(lèi)型自動(dòng)決定。
③路徑獲取
分為path和full path兩種情況,可用的API有:
?※ getFullPath(String filename)/getFullPathNoEndSeparator(String filename)
?※?getPath(String filename)/getPathNoEndSeparator(String filename)
?
④路徑的截取
包含了對(duì)擴(kuò)展名的位置判斷和分隔符的位置判斷。設(shè)想一下假如現(xiàn)在有這樣的一個(gè)路徑:C:/path/my.file/you.txt
如果我們要獲取擴(kuò)展名,使用indexOf('.'),那么返回的將是錯(cuò)誤的結(jié)果。使用Apache commons IO提供的indexOfExtension(String filename)方法,將會(huì)首先檢查在"."后是否還有"/"分隔符。
該方法內(nèi)部默認(rèn)調(diào)用了另外一個(gè)方法:indexOfLastSeparator(String filename)
⑤文件名的獲取
分為全文件名,基本文件名,擴(kuò)展名。可用的API有:
?※ getName(String filename)
?※ getBaseName(String filename)
?※ getExtension(String filename)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
