Java咖啡館——一個壓縮歸檔實用軟件(2)
發(fā)表時間:2023-12-26 來源:明輝站整理相關軟件相關文章人氣:
[摘要]1.File類 Java中是通過File類來存取文件和路徑的。沒錯,這是一個非常容易混淆的名字,你可能認為它僅僅能夠處理文件,實際上它既可以代表了一個特定的文件,又可以代表某個文件夾內的文件名列表。如果它是文件,你可以通過length()方法獲取它的大小、通過lastModified()方法最后...
1.File類
Java中是通過File類來存取文件和路徑的。沒錯,這是一個非常容易混淆的名字,你可能認為它僅僅能夠處理文件,實際上它既可以代表了一個特定的文件,又可以代表某個文件夾內的文件名列表。如果它是文件,你可以通過length()方法獲取它的大小、通過lastModified()方法最后修改時間,等等;如果它代表文件名列表,則可以用list()得到表示文件名列表的字符串數組,或者用listFiles()方法得到表示子文件列表的File數組。總之,在Java中文件夾和文件已經被統(tǒng)一成一個抽象的概念,只要了解它的原理,使用起來將會感到非常方便。
2.文件過濾
我們說過,F(xiàn)ile類的listFiles()方法可以得到表示子文件列表的File數組,如果僅僅想要得到特定的子文件而過濾掉其他的文件,則可以給listFiles()方法加上參數??一個過濾器。
所謂的過濾器,就是一個實現(xiàn)FilenameFilter接口的Java類。所謂接口(interface),就是僅僅定義了行為協(xié)議,所有聲明實現(xiàn)這個接口的類必須具體實現(xiàn)這個接口的行為。換句話說,接口是一種契約,比如這里FilenameFilter的定義是這樣子的:
public interface FilenameFilter {
boolean accept(File dir, String name);
}
我們要得到某個File類的所有子文件夾,過濾器FolderFilter類可以這么寫:
class FolderFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
return new File(dir + "\\" + name).isDirectory();
}
}
你看,F(xiàn)olderFilter類通過implements表示對FilenameFilter接口的支持,然后實現(xiàn)了這個接口的accept方法。具體地,在accept方法中,通過傳入的dir參數和name參數新建一個File實例,然后通過調用isDirectory()方法判斷這個實例是否是文件夾,是則返回True,否則返回False。
注意到這個方法必須和FilenameFilter接口里面聲明的一模一樣。正因為如此,每次手動輸入接口聲明既麻煩又容易出錯。還是讓Eclipse干體力活吧!打開Eclipse,新建一個類,名字為FolderFilter,按下Interfaces文本列表右邊的Add按鈕,在彈出的對話框中輸入FilenameFilter即可。實際上,Eclipse會根據你的輸入進行篩選,非常聰明(見圖1)。
別忘記只在Inherited abstract methods前面打勾。最后按下Finish,F(xiàn)olderFilter便創(chuàng)建好了,請根據上文補足代碼。
假設path是一個File類的實例,我們便可以通過File[] subFolders = path.listFiles(new FolderFilter())得到path的子文件夾列表了。
這就是接口的使用。加上前兩次我們講解的Java語言中關于封裝、繼承和多態(tài)的知識,Java面向對象編程就基本講完了。
3.過濾器原理
或許你會覺得過濾文件夾還要手動編寫一個類,實在是太麻煩了。實則不然。
給listFiles()參數提供一個實現(xiàn)FilenameFilter接口的類的實例,惟一目的就是讓listFiles()反過來調用作為參數的實例的accept方法。仔細體會一下這句繞口令,真是意味深長啊。這意味著你可以把任何實現(xiàn)FilenameFilter接口的類的實例當作參數傳遞,甚至是在運行時動態(tài)改變,從而使得程序更加靈活。而且,如果你要加入更多的過濾器,寫額外的類就可以了,完全不需要修改原先的過濾器,這種動態(tài)策略的思想就是一種Strategy模式的體現(xiàn)