1. 程式人生 > >獲得某個資料夾下的符合正則表示式的檔案地址

獲得某個資料夾下的符合正則表示式的檔案地址

根據使用者需求列出某個資料夾下所有滿足的檔案地址

 
 思路:
     1.獲得使用者需要查詢的資料夾和對檔名稱的需求(正則表示式)
         使用Scanner物件
     2.列出該資料夾下的所有檔案物件
         引文資料夾下可能還有資料夾,所有需要 遞迴函式查詢檔案
         檔案數目是不確定的,所以需要使用List儲存物件
     3.根據正則表示式選擇使用者需求的檔案
         根據檔案物件的getName()方法獲得檔名稱和路徑。使用String物件的matches(String regex)判斷檔名稱是否滿足要求
     4.輸出滿足要求的路徑

        使用File物件的getCanonicalPath()獲得滿足要求物件的絕對路徑。


import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;


public class FileFound {
	public static void main(String[] args) {
		//獲得使用者輸入
		String[] arr = input();
		
		//通過用輸入路徑初始化File物件
		File file = new File(arr[0]);
		
		//獲得使用者對檔案的選擇要求
		String regex = arr[1];
		
		//獲得資料夾下所有檔案的Flie物件
		List<File> lf = getFiles(file);
		//對list中檔案物件進行選擇
		selectFile(lf, regex);
		
		//顯示選擇好的檔案路徑
		for(File f : lf){
			try {
				System.out.println(f.getCanonicalPath());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/*
	 * 獲得使用者輸入
	 */
	private static String[] input(){
		//定義並且初始化要返回的字串陣列
		String[] result = new String[2];
		//輸入檔案地址
		Scanner scan = new Scanner(System.in);
		System.out.println("請輸入要查詢的目錄:");
		result[0] = scan.nextLine();
		
		//輸入要選擇檔案型別
		System.out.println("請輸入要查詢檔名稱的字串或正則表示式:");
		result[1]= scan.nextLine();
		
		//返回使用者輸入
		return result;
	}

	//在檔案列表中選擇滿足使用者要求的檔案的路徑
	public static void selectFile(List<File> lf, String regex) {
		//foreach和Iterator的區別
		//獲得List的Iterator物件
		Iterator<File> iterator = lf.iterator();
		//對檔案路徑進行遍歷
		while(iterator.hasNext()){
			File temp = iterator.next();
			String name = temp.getName();
			//根據使用者要求確定要留下的路徑資訊
			if(!name.matches(regex)){
				iterator.remove();
			}
		}
	}

	/*
	 * 建立List物件並且記錄所有檔案物件
	 */
	public static List<File> getFiles(File file){
		List<File> result = new LinkedList<>();
		if(file.isDirectory()){
			//如果file是資料夾就呼叫自動儲存路徑的方法
			getFiles1(file, result);
		} else {
			//如果是檔案就將檔案物件儲存
			result.add(file);
		}
		
		return result;
				
	}
	
	//將該檔案下檔案物件儲存在給定的List物件中
	private static void getFiles1(File file, List<File> lf){
		if(file.isDirectory()){
			for(File f : file.listFiles()){
				//如果file是檔案及就遞迴呼叫該方法
				getFiles1(f, lf);
			}
		} else {
			//如果是檔案就將檔案物件儲存
			lf.add(file);
		}
	}
}