文件搜索
搜索D:\aaa
目錄中的.java
文件。
分析:
- 目錄搜索,無法判斷多少級目錄,所以使用遞歸,遍歷所有目錄。
- 遍歷目錄時,獲取的子文件,通過文件名稱,判斷是否符合條件。
代碼實現:
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。
分析:
- 接口作爲參數,需要傳遞子類對象,重寫其中方法。我們選擇匿名內部類方式,比較簡單。
accept
方法,參數爲File,表示當前File下所有的子文件和子目錄。保留住則返回true,過濾掉則返回false。保留規則:- 要麼是.java文件。
- 要麼是目錄,用於繼續遍歷。
- 通過過濾器的作用,
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優化
分析:FileFilter
和FilenameFilter
是隻有一個方法的接口,因此他們可以用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教育品牌——黑馬程序員。