1. 程式人生 > >用深度優先和廣度優先遍歷資料夾下符合條件的檔案

用深度優先和廣度優先遍歷資料夾下符合條件的檔案

第一步:需要有一個萬能過濾器: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);
        }
    }
}

結果