Java綜合案例【文件搜索】

文件搜索

搜索D:\aaa 目錄中的.java 文件。

分析

  1. 目錄搜索,無法判斷多少級目錄,所以使用遞歸,遍歷所有目錄。
  2. 遍歷目錄時,獲取的子文件,通過文件名稱,判斷是否符合條件。

代碼實現

public class DiGuiDemo3 {
    public static void main(String[] args) {
        // 創建File對象
        File dir  = new File("D:\\aaa");
      	// 調用打印目錄方法
        printDir(dir);
    }

    public static void printDir(File dir) {
      	// 獲取子文件和目錄
        File[] files = dir.listFiles();
      	
      	// 循環打印
        for (File file : files) {
            if (file.isFile()) {
              	// 是文件,判斷文件名並輸出文件絕對路徑
                if (file.getName().endsWith(".java")) {
                    System.out.println("文件名:" + file.getAbsolutePath());
                }
            } else {
                // 是目錄,繼續遍歷,形成遞歸
                printDir(file);
            }
        }
    }
}

文件過濾器優化

我們可以使用文件過濾器來實現,在File類中有兩個和ListFiles重載的方法,方法的參數傳遞的就是過濾器。

  • File[] listFiles(FileFilter filter):返回一個抽象路徑名數組,表示由此抽象路徑名錶示的滿足指定過濾器的目錄中的文件和目錄。
  • File[] listFiles(FilenameFilter filter):返回一個抽象路徑名數組,表示由此抽象路徑名錶示的滿足指定過濾器的目錄中的文件和目錄。

方式一

java.io.FileFilter是一個接口,是File的過濾器。 該接口的對象可以傳遞給File類的listFiles(FileFilter) 作爲參數, 接口中只有一個方法,並且沒有對應的實現類。

boolean accept(File pathname) :測試pathname是否應該包含在當前File目錄中,符合則返回true。

分析

  1. 接口作爲參數,需要傳遞子類對象,重寫其中方法。我們選擇匿名內部類方式,比較簡單。
  2. accept方法,參數爲File,表示當前File下所有的子文件和子目錄。保留住則返回true,過濾掉則返回false。保留規則:
    1. 要麼是.java文件。
    2. 要麼是目錄,用於繼續遍歷。
  3. 通過過濾器的作用,listFiles(FileFilter)返回的數組元素中,子文件對象都是符合條件的,可以直接打印。

代碼實現:

public class DiGuiDemo4 {
    public static void main(String[] args) {
        File dir = new File("D:\\aaa");
        printDir2(dir);
    }
  
    public static void printDir2(File dir) {
      	// 匿名內部類方式,創建過濾器子類對象
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".java")||pathname.isDirectory();
            }
        });
      	// 循環打印
        for (File file : files) {
            if (file.isFile()) {
                System.out.println("文件名:" + file.getAbsolutePath());
            } else {
                printDir2(file);
            }
        }
    }
}    

方式二

java.io.FilenameFilter接口:實現此接口的類實例可用於過濾器文件名。
作用:用於過濾文件名稱。

boolean accept(File dir, String name) 測試指定文件是否應該包含在某一文件列表中。

參數:

  • File dir:構造方法中傳遞的被遍歷的目錄。
  • String name:使用ListFiles方法遍歷目錄,獲取的每一個文件/文件夾的名稱。
public class DiGuiDemo4 {
    public static void main(String[] args) {
        File dir = new File("D:\\aaa");
        printDir3(dir);
    }
  
    public static void printDir3(File dir) {
        // 匿名內部類方式,創建過濾器子類對象
        File[] files = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir,name).isDirectory()||name.endsWith(".java");
            }
        });
        // 循環打印
        for (File file : files) {
            if (file.isFile()) {
                System.out.println("文件名:" + file.getAbsolutePath());
            } else {
                printDir2(file);
            }
        }
    }
} 

Lambda優化

分析:FileFilterFilenameFilter是隻有一個方法的接口,因此他們可以用lambda表達式簡寫。

lambda格式:

()->{ }

代碼實現:

public static void printDir4(File dir) {
  	// lambda的改寫
    File[] files = dir.listFiles(f ->{ 
      	return f.getName().endsWith(".java") || f.isDirectory(); 
    });
    //File[] files = dir.listFiles((f,name) ->{
            //return new File(f,name).isDirectory()||name.endsWith(".java") ;
    //});
  	
	// 循環打印
    for (File file : files) {
        if (file.isFile()) {
            System.out.println("文件名:" + file.getAbsolutePath());
      	} else {
        	printDir3(file);
      	}
    }
}

我是知識的搬運工,該篇文章內容藉助於高端IT教育品牌——黑馬程序員。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章