用深度優先和廣度優先遍歷資料夾下符合條件的檔案
阿新 • • 發佈:2019-01-03
第一步:需要有一個萬能過濾器:MyFileFilter.java
package com.ten.practice.test15;
import java.io.File;
import java.io.FilenameFilter;
public class MyFileFilter implements FilenameFilter {
//萬能過濾器
private String suffix;
public MyFileFilter(String suffix) {
this.suffix = suffix;
}
@Override
public boolean accept(File dir, String name) {
File f = new File(dir, name);
if(f.isFile()){
return f.getName().endsWith(suffix);//符合要求的檔案返回
}
return true;//是檔案也返回
}
}
第二步:需要一個MyDFS.java來深度優先搜尋某一資料夾
package com.ten.practice.test15;
import java.io.File;
import java.util.ArrayList;
public class MyDFS {
private static MyFileFilter myFileter = null;
public static ArrayList<String> myDFS(File path, String suffix){
//list用於返回符合條件的檔案
ArrayList<String> list = new ArrayList<String>();
//呼叫配置好的過濾器
myFileter = new MyFileFilter(suffix);
depth(path, suffix, list);
return list;
}
private static void depth(File argPath, String argSuffix, ArrayList<String> argList) {
File[] files = argPath.listFiles(myFileter);
for(File f : files){
if(f.isDirectory()){//是資料夾,直接作為需要檢索的資料夾進行檢索
depth(f, argSuffix, argList);
}else{
argList.add(f.getAbsolutePath());//是檔案則入list集合
}
}
}
}
第三步:需要一個MyBFS.java來廣度優先搜尋某一資料夾
package com.ten.practice.test15;
import java.io.File;
import java.util.ArrayDeque;
import java.util.ArrayList;
public class MyBFS {
private static MyFileFilter myFilter= null;
public static ArrayList<String> myBFS(File argPath, String argSuffix){
//myList用來儲存過濾出來的檔案
ArrayList<String> myList = new ArrayList<String>();
//queue儲存路徑
ArrayDeque<File> queue = new ArrayDeque<File>();
//初始化過濾器
myFilter = new MyFileFilter(argSuffix);
//把要檢索的資料夾路徑放入佇列中
queue.offer(argPath);
while(!queue.isEmpty()){//判斷佇列不為空
argPath= queue.poll();//把隊首作為當前檢索的路徑
File[] files = argPath.listFiles(myFilter);//獲得當前檢索的路徑所有的子檔案和資料夾
for(File f:files){
if(f.isFile()){
myList.add(f.getAbsolutePath());//是檔案入list集合
}else{
queue.offer(f);//是資料夾入queue作為新的需要檢索資料夾的路徑
}
}
}
return myList;
}
}
第四步:需要一個TestFileFilter.java來測試
package com.ten.practice.test15;
import java.io.File;
import java.util.ArrayList;
public class TestFileFilter {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
File path = new File("D:\\workplace\\Myeclipse\\Practice\\src\\com\\ten\\practice\\test14");
String suffix = ".txt";
list = MyDFS.myDFS(path, suffix);
for(String s:list){
System.out.println(s);
}
System.out.println("--------分割線@[email protected]也裝逼---------");
list = MyBFS.myBFS(path, suffix);
for(String s:list){
System.out.println(s);
}
}
}