Java IO文件過(guò)濾器對(duì)命令設(shè)計(jì)模式的使用
一. 點(diǎn)睛
java io流里面使用到了很多的設(shè)計(jì)模式,最典型的就是裝飾模式,還有命令模式。通過(guò)對(duì)文件過(guò)濾器功能的簡(jiǎn)單使用,可以一窺java io流對(duì)命令設(shè)計(jì)模式的典型使用。下面分兩部分來(lái)講,先舉例說(shuō)說(shuō)文件過(guò)濾器的簡(jiǎn)單使用,再引申到它是如何使用到命令設(shè)計(jì)模式的,不會(huì)大篇幅講模式,對(duì)命令模式想做更深入的了解請(qǐng)參考其他資料。
二. 示例
我們進(jìn)行java編程的時(shí)候,如果想要訪問(wèn)文件或者目錄,會(huì)使用File類,F(xiàn)ile是一個(gè)很強(qiáng)大的類,不管文件還是目錄都可以使用它。如果要遍歷文件會(huì)使用到File類的list()方法,它會(huì)列出當(dāng)前File對(duì)象的所有子文件名和路徑名,如果有的文件名或者路徑名不想要列出來(lái)怎么辦?File類給提供了另外一個(gè)重載的具有過(guò)濾功能的方法list(FilenameFilter filter)可以滿足我們的需要,方法聲明如下:
public String[] list(FilenameFilter filter);
參數(shù)里面的FilenameFilter就是文件名過(guò)濾接口,該接口有一個(gè)方法accept()方法,我們自定義的文件名過(guò)濾器需要實(shí)現(xiàn)該接口,并實(shí)現(xiàn)accept()方法來(lái)自定義規(guī)則。FilenameFilter接口聲明如下所示:
public interface FilenameFilter { boolean accept(File dir, String name); }
下面來(lái)看具體怎么使用的,含義為列出當(dāng)前工作空間下所有以.xml結(jié)尾的文件名或者路徑名。
1. 編寫(xiě)自定義文件過(guò)濾器:
package org.light4j.io.fileFilter; import java.io.File; import java.io.FilenameFilter; /** * 自定義文件名過(guò)濾器 * * @author longjiazuo * */ public class MyFilenameFilter implements FilenameFilter { @Override public boolean accept(File dir, String name) { // 如果文件以.xml結(jié)尾則符合條件返回true return name.endsWith(".xml"); } }
2. 編寫(xiě)測(cè)試類
package org.light4j.io.fileFilter; import java.io.File; /** * 文件過(guò)濾器測(cè)試 * * <p> * 列出當(dāng)前工作目錄下符合條件的所有子文件名和路徑名 * </p> * * @author longjiazuo * */ public class FilenameFilterTest { public static void main(String[] args) { // 獲取工作目錄 String workDir = System.getProperty("user.dir"); File file = new File(workDir); // 列舉當(dāng)前工作目錄下的所有文件 String[] files = file.list(new MyFilenameFilter()); // 循環(huán)遍歷 for (String string : files) { System.out.println(string); } } }
運(yùn)行上面代碼可以在控制臺(tái)看到只列出以.xml結(jié)尾的文件名或者路徑名。
三. 命令設(shè)計(jì)模式
命令模式是關(guān)于如何處理一個(gè)對(duì)象請(qǐng)求另外一個(gè)對(duì)象調(diào)用其方法完成某項(xiàng)功能的設(shè)計(jì)模式,當(dāng)一個(gè)對(duì)象請(qǐng)求另外一個(gè)對(duì)象調(diào)用其方法時(shí),并不和被請(qǐng)求的對(duì)象直接交互,而是把這種請(qǐng)求封裝到一個(gè)命令對(duì)象中,具體做法是將請(qǐng)求封裝在命令對(duì)象的一個(gè)方法里,將命令對(duì)象作為參數(shù)傳遞。命令模式的核心就是使用命令對(duì)象來(lái)封裝方法的調(diào)用。
在項(xiàng)目中,我們不會(huì)只有一個(gè)類,所以經(jīng)常涉及一個(gè)對(duì)象請(qǐng)求另外一個(gè)對(duì)象調(diào)用它的方法來(lái)達(dá)到某種目的。如果請(qǐng)求者這時(shí)候不希望或者無(wú)法直接和被請(qǐng)求者進(jìn)行交互,換句話說(shuō)就是請(qǐng)求者不包含被請(qǐng)求者的引用,那么這個(gè)時(shí)候二者如何進(jìn)行交互?我們可以使用命令模式來(lái)達(dá)到目的。例如,我們?nèi)粘|c(diǎn)外賣(mài),我們并不直接和飯店打交道,而是會(huì)上美團(tuán)等外賣(mài)網(wǎng)站購(gòu)買(mǎi),外賣(mài)網(wǎng)站會(huì)把你要買(mǎi)外賣(mài)的請(qǐng)求作為一個(gè)點(diǎn)餐命令告訴飯店,只要該點(diǎn)餐命令被成功傳遞給飯店,你就一定能夠收到外賣(mài)。
現(xiàn)在回到文件過(guò)濾器的使用上面來(lái),F(xiàn)ile類的list(FilenameFilter filter)方法通過(guò)使用一個(gè)接口對(duì)象作為參數(shù)來(lái)實(shí)現(xiàn)過(guò)濾文件名的功能,具體的規(guī)則定義則是在FilenameFilter接口子類的方法accept()里面來(lái)實(shí)現(xiàn)的,這就是對(duì)命令設(shè)計(jì)模式的使用。
按道理,既然list(FilenameFilter filter)方法想要一個(gè)判斷哪些文件需要被列出來(lái)的規(guī)則,那我們把規(guī)則傳進(jìn)去就行了,這個(gè)規(guī)則是一個(gè)代碼塊,但是目前的java并不支持向方法里面?zhèn)魅氪a塊的做法,所以java使用了FilenameFilter的accept()方法來(lái)封裝判斷規(guī)則,傳入的MyFilenameFilter對(duì)象的作用其實(shí)是為了傳入accept()方法的方法體,這個(gè)方法體的作用就是判斷哪些文件名或者路徑名符合規(guī)則,list(FilenameFilter filter)的實(shí)現(xiàn)源碼如下所示:
四. 源代碼示例
github地址:點(diǎn)擊查看
碼云地址:點(diǎn)擊查看
以上所述是小編給大家介紹的Java IO文件過(guò)濾器對(duì)命令設(shè)計(jì)模式的使用,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
jasypt SaltGenerator接口定義方法源碼解讀
這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09JAVA多線程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者的實(shí)例詳解
這篇文章主要介紹了JAVA多線程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06詳解Java中使用泛型實(shí)現(xiàn)快速排序算法的方法
這篇文章主要介紹了Java中使用泛型實(shí)現(xiàn)快速排序算法的方法,快速排序的平均時(shí)間復(fù)雜度為(n\log n),文中的方法立足于基礎(chǔ)而并沒(méi)有考慮優(yōu)化處理,需要的朋友可以參考下2016-05-05解決springboot項(xiàng)目打成jar包后運(yùn)行時(shí)碰到的小坑
這篇文章主要介紹了解決springboot項(xiàng)目打成jar包后運(yùn)行時(shí)碰到的小坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02RestTemplate實(shí)現(xiàn)多種底層HTTP客戶端類庫(kù)的切換用法
這篇文章主要為大家詳細(xì)的講解了RestTemplate實(shí)現(xiàn)多種底層HTTP客戶端類庫(kù)的切換示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步2022-03-03