递归查找目录中的所有文本文件

我试图获取目录中所有文本文件的名称。 如果目录有子目录,那么我也想在那些文件中获取任何文本文件。 我不知道如何让任何数量的子目录继续进行。

现在,下面的代码只获取当前目录中的所有文本文件以及目录中的子目录。 对于找到的每个子目录,它还会查找任何文本文件和更深的子目录。 问题是,如果那些更深层的子目录还有更深的子目录,那么我找不到所有的文本文件。 这似乎是一个需要递归的问题,因为我不知道这会有多深。

这是我到目前为止的代码:

File rootDirectory = new File(rootDir); if (rootDirectory.isDirectory()) { System.out.println("Valid directory"); File[] listOfFiles = rootDirectory.listFiles(); for (int i = 0; i < listOfFiles.length; i++) { String iName = listOfFiles[i].getName(); if (listOfFiles[i].isFile()) { if (iName.endsWith(".txt") || iName.endsWith(".TXT")) { System.out.println("File: "+iName); } } if (listOfFiles[i].isDirectory()) { System.out.println("Directory: "+iName); File[] subList = listOfFiles[i].listFiles(); for (int j = 0; j < subList.length; j++) { String jName = subList[j].getName(); if (subList[j].isFile()) { if (jName.endsWith(".txt") || jName.endsWith(".TXT")) { System.out.println("\tFile: "+jName); } } if (subList[j].isDirectory()) { System.out.println("\tDirectory: "+jName); } } } } } else System.out.println("Invalid directory"); 

编辑 :搞定了,谢谢Olaf Dietsche:

 public void findFiles(File root, int depth) { File[] listOfFiles = root.listFiles(); for (int i = 0; i < listOfFiles.length; i++) { String iName = listOfFiles[i].getName(); if (listOfFiles[i].isFile()) { if (iName.endsWith(".txt") || iName.endsWith(".TXT")) { for (int j = 0; j < depth; j++) System.out.print("\t"); System.out.println("File: "+iName); } } else if (listOfFiles[i].isDirectory()) { for (int j = 0; j < depth; j++) System.out.print("\t"); System.out.println("Directory: "+iName); findFiles(listOfFiles[i], depth+1); } } } 

这是一个递归问题

 public void find_files(File root) { File[] files = root.listFiles(); for (File file : files) { if (file.isFile()) { ... } else if (file.isDirectory()) { find_files(file); } } } 

使用java 7的java.nio.filefunction。我实现了类似的func。 并添加了一些测试。

在我的电脑上搜索.txt时的基准测试

  "c:/" "c:/windows" file.io 36272ms 14082ms file.nio 7167ms 2987ms 

阅读更多javadoc,它是非常强大的API

java.nio.file.filevisitor javadoc

 public static void main(String[] args) { long starttime = System.currentTimeMillis(); try { Path startPath = Paths.get("c:/"); Files.walkFileTree(startPath, new SimpleFileVisitor() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { System.out.println("Dir: " + dir.toString()); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { if (file.toString().endsWith(".txt")){ System.out.println(file.toString()); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException e) { return FileVisitResult.CONTINUE; } }); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } long completetime = System.currentTimeMillis() - starttime; System.out.println("totaltime=" + completetime); } 

答案就在你问题的标签上。 使用递归。 递归包括一个方法调用本身。

在这种情况下,该方法应该直接打印给定目录下的所有文本文件,并为目录的每个子目录调用自身。