明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Java咖啡館——一個(gè)壓縮歸檔實(shí)用軟件(2)

[摘要]1.File類  Java中是通過(guò)File類來(lái)存取文件和路徑的。沒(méi)錯(cuò),這是一個(gè)非常容易混淆的名字,你可能認(rèn)為它僅僅能夠處理文件,實(shí)際上它既可以代表了一個(gè)特定的文件,又可以代表某個(gè)文件夾內(nèi)的文件名列表。如果它是文件,你可以通過(guò)length()方法獲取它的大小、通過(guò)lastModified()方法最后...

    

  1.File類

  Java中是通過(guò)File類來(lái)存取文件和路徑的。沒(méi)錯(cuò),這是一個(gè)非常容易混淆的名字,你可能認(rèn)為它僅僅能夠處理文件,實(shí)際上它既可以代表了一個(gè)特定的文件,又可以代表某個(gè)文件夾內(nèi)的文件名列表。如果它是文件,你可以通過(guò)length()方法獲取它的大小、通過(guò)lastModified()方法最后修改時(shí)間,等等;如果它代表文件名列表,則可以用list()得到表示文件名列表的字符串?dāng)?shù)組,或者用listFiles()方法得到表示子文件列表的File數(shù)組?傊贘ava中文件夾和文件已經(jīng)被統(tǒng)一成一個(gè)抽象的概念,只要了解它的原理,使用起來(lái)將會(huì)感到非常方便。

  2.文件過(guò)濾

  我們說(shuō)過(guò),F(xiàn)ile類的listFiles()方法可以得到表示子文件列表的File數(shù)組,如果僅僅想要得到特定的子文件而過(guò)濾掉其他的文件,則可以給listFiles()方法加上參數(shù)??一個(gè)過(guò)濾器。
所謂的過(guò)濾器,就是一個(gè)實(shí)現(xiàn)FilenameFilter接口的Java類。所謂接口(interface),就是僅僅定義了行為協(xié)議,所有聲明實(shí)現(xiàn)這個(gè)接口的類必須具體實(shí)現(xiàn)這個(gè)接口的行為。換句話說(shuō),接口是一種契約,比如這里FilenameFilter的定義是這樣子的:

public interface FilenameFilter {
    boolean accept(File dir, String name);
}

  我們要得到某個(gè)File類的所有子文件夾,過(guò)濾器FolderFilter類可以這么寫(xiě):

class FolderFilter implements FilenameFilter {
  public boolean accept(File dir, String name) {
    return new File(dir + "\\" + name).isDirectory();
  }
}

  你看,F(xiàn)olderFilter類通過(guò)implements表示對(duì)FilenameFilter接口的支持,然后實(shí)現(xiàn)了這個(gè)接口的accept方法。具體地,在accept方法中,通過(guò)傳入的dir參數(shù)和name參數(shù)新建一個(gè)File實(shí)例,然后通過(guò)調(diào)用isDirectory()方法判斷這個(gè)實(shí)例是否是文件夾,是則返回True,否則返回False。

  注意到這個(gè)方法必須和FilenameFilter接口里面聲明的一模一樣。正因?yàn)槿绱耍看问謩?dòng)輸入接口聲明既麻煩又容易出錯(cuò)。還是讓Eclipse干體力活吧!打開(kāi)Eclipse,新建一個(gè)類,名字為FolderFilter,按下Interfaces文本列表右邊的Add按鈕,在彈出的對(duì)話框中輸入FilenameFilter即可。實(shí)際上,Eclipse會(huì)根據(jù)你的輸入進(jìn)行篩選,非常聰明(見(jiàn)圖1)。

Java咖啡館——一個(gè)壓縮歸檔實(shí)用軟件(2)


  別忘記只在Inherited abstract methods前面打勾。最后按下Finish,F(xiàn)olderFilter便創(chuàng)建好了,請(qǐng)根據(jù)上文補(bǔ)足代碼。

  假設(shè)path是一個(gè)File類的實(shí)例,我們便可以通過(guò)File[] subFolders = path.listFiles(new FolderFilter())得到path的子文件夾列表了。

  這就是接口的使用。加上前兩次我們講解的Java語(yǔ)言中關(guān)于封裝、繼承和多態(tài)的知識(shí),Java面向?qū)ο缶幊叹突局v完了。

  3.過(guò)濾器原理

  或許你會(huì)覺(jué)得過(guò)濾文件夾還要手動(dòng)編寫(xiě)一個(gè)類,實(shí)在是太麻煩了。實(shí)則不然。
給listFiles()參數(shù)提供一個(gè)實(shí)現(xiàn)FilenameFilter接口的類的實(shí)例,惟一目的就是讓listFiles()反過(guò)來(lái)調(diào)用作為參數(shù)的實(shí)例的accept方法。仔細(xì)體會(huì)一下這句繞口令,真是意味深長(zhǎng)啊。這意味著你可以把任何實(shí)現(xiàn)FilenameFilter接口的類的實(shí)例當(dāng)作參數(shù)傳遞,甚至是在運(yùn)行時(shí)動(dòng)態(tài)改變,從而使得程序更加靈活。而且,如果你要加入更多的過(guò)濾器,寫(xiě)額外的類就可以了,完全不需要修改原先的過(guò)濾器,這種動(dòng)態(tài)策略的思想就是一種Strategy模式的體現(xiàn)