1、先看一個File類的簡單的例子
package test;import java.io.File;import java.io.FilenameFilter;import java.util.Arrays;import java.util.Scanner;import java.util.regex.Pattern;/** * File代表檔案和目錄,靜態域有:與系統有關的路徑分隔字元、與系統有關的預設名稱分隔字元。 * 主要操作有:建立檔案或目錄、刪除檔案、給檔案設定屬性、返回指定目錄下的檔案清單、 * 返回過濾後的檔案清單、 檢測檔案是否存在、是否隱藏、是否是目錄還是檔案、 * 返迴文件名稱和路徑 * * @author Touch * */public class FileDemo {/* * 尋找指定路徑下的匹配regex的檔案 */public String[] find(String path, final String regex) {File file = new File(path); //匿名內部類return file.list(new FilenameFilter() {private Pattern pattern = Pattern.compile(regex);@Overridepublic boolean accept(File dir, String name) {// TODO Auto-generated method stubreturn pattern.matcher(name).matches();}});}public static void main(String[] args) {String path = null;String key = null;String regex = null;int choice = 1;Scanner scanner = new Scanner(System.in);System.out.println("please input the file path:");path = scanner.next();System.out.println("please input key:");key = scanner.next();System.out.println("choise:\n0:匹配以" + key + "為尾碼的檔案\n1:匹配包含" + key+ "的檔案");if ((choice = scanner.nextInt()) == 0)regex = ".*\\." + key;elseregex = ".*" + key + ".*";String[] list;list = new FileDemo().find(path, regex);System.out.println(Arrays.deepToString(list));//返回指定路徑下的目錄列表File[] fileList = new File(path).listFiles();for (File file : fileList) {if (file.isDirectory()) {list = new FileDemo().find(file.getPath(), regex);System.out.println(Arrays.deepToString(list));}}}}
2、看完這個例子,是不是可以寫個工具類呢,用於搜尋指定路徑下的所有檔案或者目錄,當然也可以輸入Regex,這樣就可以篩選出我們想要的檔案(如有時候我們只需要.java檔案或者.txt檔案)
package mine.util;import java.io.File;import java.util.ArrayList;import java.util.List;/** * FileDirectory類用於尋找指定根目錄下的所有檔案和目錄 可以通過Regex對要尋找的 檔案及目錄進行篩選 * * @author Touch */public final class SearchFile {// 存放檔案private List<File> fileList = new ArrayList<File>();// 存放目錄private List<File> directoryList = new ArrayList<File>();// 存放檔案和目錄private List<File> list = new ArrayList<File>();private File file;// 目錄private String regex;// Regexpublic SearchFile(String path) {file = new File(path);this.regex = ".*";}public SearchFile(File file) {this.file = file;this.regex = ".*";}public SearchFile(String path, String regex) {file = new File(path);this.regex = regex;}public SearchFile(File file, String regex) {this.file = file;this.regex = regex;}// 返回目前的目錄下的所有檔案及子目錄public List<File> files() {File[] files = file.listFiles();List<File> list = new ArrayList<File>();for (File f : files)if (f.getName().matches(regex))list.add(f);return list;}// 返回該根目錄下的所有檔案public List<File> allFiles() {if (list.isEmpty())search(file);return fileList;}// 返回該根目錄下的所有子目錄public List<File> allDirectory() {if (list.isEmpty())search(file);return directoryList;}// 返回該根目錄下的所有檔案及子目錄public List<File> allFilesAndDirectory() {if (list.isEmpty())search(file);return list;}// 遞迴搜尋目前的目錄下的所有檔案及目錄private void search(File file) {File[] files = file.listFiles();if (files == null || files.length == 0)return;for (File f : files) {if (f.getName().matches(regex))list.add(f);if (f.isFile() && f.getName().matches(regex))fileList.add(f);else {if (f.getName().matches(regex))directoryList.add(f);search(f);}}}}
3、測試
package mine.util;import java.io.File;import java.util.List;public class TestSearchFile {public static void main(String[] args) {System.out.println("-------- 指定目錄中所有檔案及子目錄-------");List<File> list = (List<File>) new SearchFile("G:/java/workspace/test/file").files();for (File file : list)System.out.println(file.getName());System.out.println("--------指定目錄中以txt為尾碼的檔案------");list = (List<File>) new SearchFile("G:/java/workspace/test/file",".*\\.txt").files();for (File file : list)System.out.println(file.getName());System.out.println("--------以該目錄為根目錄的所有檔案及子目錄--");list = (List<File>) new SearchFile("G:/java/workspace/test").allFilesAndDirectory();for (File file : list)System.out.println(file.getName());}}
4、結果:
-------- 指定目錄中所有檔案及子目錄-------
aa.data
bb.dat
object
test.txt
test1.txt
test2.txt
test3.txt
test4.txt
test5
--------指定目錄中以txt為尾碼的檔案------
test.txt
test1.txt
test2.txt
test3.txt
test4.txt
--------以該目錄為根目錄的所有檔案及子目錄--
.classpath
.project
.settings
org.eclipse.jdt.core.prefs
bin
http
PassWord.class
Test.class
mine
util
SearchFile.class
TestSearchFile.class
test
A.class
ArraysDemo.class
B.class
ByteArrayInputStreamDemo.class
DataInputStreamAndByteArrayInputStreamDemo.class
DataInputStreamDemo.class
DeepCloneDemo.class
FileDemo$1.class
FileDemo.class
FileInputStreamDemo.class