2012-05-28 129 views
6

在Java中查找具有特定名稱的目錄的最佳方式是什麼?我正在查找的目錄可以位於當前目錄或其某個子目錄中。在Java中遞歸搜索目錄

+3

[?你嘗試過什麼(http://www.whathaveyoutried.com/)或者說,你的理論基於測試你能想到的最好的2種聳肩方法?或者這個問題實際上是否意味着「你能給我編碼嗎?」? –

回答

2

您的解決方案將包括使用File.listFiles(String)

java.io.File API reference

+0

謝謝安德魯。我受限於1.6,但我忘記了其他人不是。 – MadcoreTom

+0

*「我被約束了1.6」*和我一樣(除了當我回到1.5 dev或更高版本時)。幸運的那些文檔。有'@ since'標籤和編譯器具有交叉編譯選項作爲版本兼容性的'酸性測試'。即使人們提到他們正在爲Java 1.3開發,我也會鏈接到最新的Java Docs。 ;) –

0

分而治之?天真的方法:對於每一個目錄,你可以開始一個任務,它具有以下功能:

  1. 列表中的每個目錄
  2. 如果列表中包含匹配的目錄,打印和退出應用程序
  3. 啓動任務爲每個目錄。
4

要走文件樹,可以使用FileVisitor接口。 請參閱tutorial。另請參閱Find sample codes

+0

這是比@ MadcoreTom的#listFiles更好的解決方案,因爲它可以讓您在找到文件後終止漫遊。 – Kong

0

喜歡的東西:

public static final File findIt(File rootDir, String fileName) { 
    File[] files = rootDir.listFiles(); 
    List<File> directories = new ArrayList<File>(files.length); 
    for (File file : files) { 
     if (file.getName().equals(fileName)) { 
      return file; 
     } else if (file.isDirectory()) { 
      directories.add(file); 
     } 
    } 

    for (File directory : directories) { 
     File file = findIt(directory); 
     if (file != null) { 
      return file; 
     } 
    } 

    return null; 
} 
2

至於你提到的遞歸應該通過streams API迎合這種需求

import java.io.File; 

public class CheckFile { 

    private static boolean foundFolder = false; 

    public static void main(String[] args) { 
     File dir = new File("currentdirectory"); 
     findDirectory(dir); 
    } 

    private static void findDirectory(File parentDirectory) { 
     if(foundFolder) { 
      return; 
     } 
     File[] files = parentDirectory.listFiles(); 
     for (File file : files) { 
      if (file.isFile()) { 
       continue; 
      } 
      if (file.getName().equals("folderNameToFind")) { 
       foundFolder = true; 
       break; 
      } 
      if(file.isDirectory()) { 
       findDirectory(file); 
      } 
     } 
    } 

} 
+0

我是否正確,這種方法是不可重複使用的(將其移動到某個實用程序類將不起作用),即它只能檢測一次文件夾,一旦檢測到「foundFolder」將保持爲真? –

5

在Java 8:

Optional<Path> hit = Files.walk(myPath) 
    .filter(file -> file.getFileName().equals(myName)) 
    .findAny(); 

的#walk很懶,所以任何short-circuiting terminal operation都會優化所需的IO。

+0

將'Path.getFileName'中的'java.nio.Path'與'String'進行比較。我建議'file.getFileName()。toFile.getName()'知道這看起來很複雜,也許很昂貴。 –

0

或者,你應該使用遞歸的概念搜索文件,直到它發現:這裏是代碼:

String name; //to hold the search file name 

public String listFolder(File dir) { 
    int flag; 
    File[] subDirs = dir.listFiles(new FileFilter() { 
     @Override 
     public boolean accept(File pathname) { 
      return pathname.isDirectory(); 
     } 
    }); 
    System.out.println("File of Directory: " + dir.getAbsolutePath()); 
    flag = Listfile(dir); 
    if (flag == 0) { 
     System.out.println("File Found in THe Directory: " + dir.getAbsolutePath()); 
     Speak("File Found in THe Directory: !!" + dir.getAbsolutePath()); 
     return dir.getAbsolutePath(); 
    } 
    for (File folder : subDirs) { 
     listFolder(folder); 
    } 
    return null; 
} 

private int Listfile(File dir) { 
    boolean ch = false; 
    File[] files = dir.listFiles(); 
    for (File file : files) { 
     Listfile(file); 
     if (file.getName().indexOf(name.toLowerCase()) != -1) {//check all in lower case 
      System.out.println(name + "Found Sucessfully!!"); 
      ch = true; 

     } 
    } 
    if (ch) { 
     return 1; 
    } else { 
     return 0; 
    } 
}