Java 目錄從遞迴的搜尋文件於
Java 這裡我們介紹一個範例程序,它遞歸地搜尋指定目錄(包括子目錄)中的文件,並取得符合搜尋條件的文件清單。
它們執行與 UNIX 命令 ls -R 和 Windows 命令 dir /s 相同的處理。
您也可以在檔案名稱中指定*作為通配符進行搜索,或使用正規表示式進行搜尋。
作為使用範例,在以下情況下,遞歸搜尋目錄 filelist 包括子目錄,以取得副檔名為 java.lang.java 的檔案清單。
File[] files = search.listFiles(“C:/filelist/”, “*.java”);
範例程式
/**
*
*/
公共類文件搜尋{
公共靜態最終int TYPE_FILE_OR_DIR = 1;
公共靜態最終int TYPE_FILE = 2;
公共靜態最終 int TYPE_DIR = 3;
/**
* 從指定目錄[directoryPath]開始,
* 遞歸尋找要尋找的檔案[fileName],找到對應的檔案。
* 傳回文件物件的清單。
*
* 例)
* File[] files =listFiles(“C:/filelist/”, “*.java”);
* 上面的例子遞歸地搜尋目錄檔案列表並
* 取得副檔名為java的檔案清單。
*
* @param directoryPath 表示要搜尋的目錄的路徑
* @param fileName 要搜尋的檔名
* 您可以在檔案名稱中指定 * 作為萬用字元。
* @return 與搜尋匹配的文件對象
*/
公用檔案[] listFiles(字串目錄路徑,字串檔名){
// 將 * 作為通配符轉換為正規表示式
if (檔名!= null) {
檔案名稱 = 檔名.replace(“.”, “\\.”);
檔案名稱 = 檔名.replace(“*”, “.*”);
}
傳回 listFiles(目錄路徑, 檔名, TYPE_FILE, true, 0);
}
/**
* 從指定目錄[directoryPath]開始,指定為正規表示式
* 遞歸搜尋要搜尋的檔案[fileNamePattern],
* 傳回適用文件物件的清單。
*
* 您也可以使用搜尋條件來確定文件的更新日期是否已經超過指定的天數。
* 可以指定。
*
* 例)
* 文件[] 文件 =
* listFiles(“C:/filelist/”, “*.java”,TYPE_FILE, true, 2);
* 在上面的範例中,目錄filelist被遞歸搜尋並且更新時間小於7天。
* 取得副檔名為java的檔案清單。
*
* @param directoryPath 表示要搜尋的目錄的路徑
* @param fileNamePattern 要搜尋的檔案名稱[正規表示式]
* @param type [type]指定對應的檔案物件。
* 可以指定以下內容
* TYPE_FILE_OR_DIR・・・檔案和目錄
* TYPE_FILE・・・文件
* TYPE_DIR・・・目錄
* @param isRecursive true 表示遞迴搜尋
* @param period 搜尋更新日期已超過指定天數的檔案。
* 可設定是否
* 如果為 0,則不適用
* 如果1個或多個,則搜尋指定天數後的文件
* 如果小於-1,則搜尋早於指定天數的文件
* @return 與搜尋匹配的文件對象
*/
公用檔案[] listFiles(字串目錄路徑,
String fileNamePattern,int型,
布爾 isRecursive, int period) {
文件目錄 = 新文件(目錄路徑);
if (!dir.isDirectory()) {
拋出新的 IllegalArgumentException
(「參數中指定的路徑[」 + dir.getAbsolutePath() +
“] 不是目錄。”);
}
File[] files = dir.listFiles();
// 它的輸出
for (int i = 0; i < 檔案長度; i++) {
文件 文件 = 文件[i];
addFile(型別, fileNamePattern, 設定, 檔案, 句點);
// 遞迴查找,如果是目錄則遞迴加入到清單中
if (isRecursive && file.isDirectory()) {
listFiles(file.getAbsolutePath(), fileNamePattern,
類型、isRecursive、句點);
}
}
return (File[]) set.toArray(new File[set.size()]);
}
private void addFile(int 類型, String 匹配, TreeSet 集合,
文件 file,int 週期) {
開關(類型){
案例類型文件:
if (!file.isFile()) {
返回;
}
休息;
案例類型_目錄:
if (!file.isDirectory()) {
返回;
}
休息;
}
if (match != null && !file.getName().matches(match)) {
返回;
}
// 如果有指定是否已經過了指定天數
如果(句號!= 0){
// 檔案更新日期
日期最後修改日期 = new Date(file.lastModified());
String lastModifiedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(最後修改日期);
// 指定日期(以每天的毫秒數計算)
長一天時間 = 24L * 60L * 60L * 1000L;
長 periodTime = oneDayTime * Math.abs(period);
指定日期Date =
new Date(System.currentTimeMillis() – periodTime);
String DesignatedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(指定日期);
如果(週期> 0){
if (lastModifiedDateStr.compareTo(designatedDateStr) < 0) {
返回;
}
} 別的 {
if (lastModifiedDateStr.compareTo(designatedDateStr) > 0) {
返回;
}
}
}
// 如果滿足所有條件則儲存在清單中
set.add(檔案);
}
/** 使用 TreeSet 按字母順序排序。 */
私有 TreeSet set = new TreeSet();
/**
* 如果您想在建立實例後繼續使用該實例,請使用此方法。
* 通話必須被清除。
* 例)
* 文件搜尋搜尋 = new FileSearch();
* File[] f1 = search.listFiles(C:/filelist/”, “*.java”);
* 搜尋.clear();
* File[] f2 = search.listFiles(“C:/filelist/”, “*.jsp”);
*/
公共無效清除(){
設定.clear();
}
}
執行結果
為了檢查範例程序,我建立了一個 filelist 目錄並準備了以下檔案。
顯示檔案名稱和更新日期。
*請注意,目前日期是2007/08/18假設是這樣。
C:\filelist │ aaa.java 2007/08/18 │ bbb.java 2007/08/18 └─dir ccc.java 2007/07/17 ddd.java 2007/08/18 eee.jpg 2007/08
◆執行範例
System.out.println(“\n●取得所有檔案”);
File[] files = search.listFiles(path, null);
列印文件列表(文件);
搜尋.清除();
System.out.println(“\n●取得副檔名為java的檔案”);
檔案 = search.listFiles(路徑, “*.java”);
列印文件列表(文件);
搜尋.清除();
System.out.println(“\n●取得所有檔案和目錄”);
文件= search.listFiles(路徑, null,search.TYPE_FILE_OR_DIR, true, 0);
列印文件列表(文件);
搜尋.清除();
System.out.println(“\n●取得目前日期後2天內更新的檔案”);
文件= search.listFiles(路徑, null,search.TYPE_FILE, true, 2);
列印文件列表(文件);
搜尋.清除();
System.out.println(“\n●取得距離目前日期超過30天的舊檔案”);
檔案 = search.listFiles(路徑, null,search.TYPE_FILE, true, -30);
列印文件列表(文件);
搜尋.清除();
}
私有靜態無效 printFileList(File[] files) {
for (int i = 0; i < 檔案長度; i++) {
文件 文件 = 文件[i];
System.out.println((i + 1) + “:” + 檔案);
}
}
◆輸出結果
●取得所有檔案 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc.java 4: C:\filelist\dir\ddd.java 5: C:\filelist\dir\eee.jpg ●取得副檔名為java 的檔案1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc .java 4: C:\filelist\dir\ddd.java ●取得所有檔案和目錄1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir 4: C: \filelist \dir\ccc.java 5: C:\filelist\dir\ddd.java 6: C:\filelist\dir\eee.jpg ●目前日期後2 天內更新的檔案取得1:C:\filelist\aaa 。java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ddd.java 4: C:\filelist\dir\eee.jpg ● 目前日期取得從1: C: 開始超過30 天的舊檔案\filelist\dir\ccc.java