如何在Java中扫描文件夹?

如何在Java中recursion地列出文件夹中的所有文件?

不知道你想如何表示树? 无论如何,这里是一个使用recursion扫描整个子树的例子。 文件和目录都是一样的。 请注意, File.listFiles()为非目录返回null。

public static void main(String[] args) { Collection<File> all = new ArrayList<File>(); addTree(new File("."), all); System.out.println(all); } static void addTree(File file, Collection<File> all) { File[] children = file.listFiles(); if (children != null) { for (File child : children) { all.add(child); addTree(child, all); } } } 

Java 7提供了一些改进。 例如, DirectoryStream一次提供一个结果 – 调用者不再需要等待所有的I / O操作才能完成。 这允许增量GUI更新,提前取消等。

 static void addTree(Path directory, Collection<Path> all) throws IOException { try (DirectoryStream<Path> ds = Files.newDirectoryStream(directory)) { for (Path child : ds) { all.add(child); if (Files.isDirectory(child)) { addTree(child, all); } } } } 

请注意,可怕的空返回值已被IOException取代。

Java 7还提供了一个树步行者 :

 static void addTree(Path directory, final Collection<Path> all) throws IOException { Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { all.add(file); return FileVisitResult.CONTINUE; } }); } 
 import java.io.File; public class Test { public static void main( String [] args ) { File actual = new File("."); for( File f : actual.listFiles()){ System.out.println( f.getName() ); } } } 

它显示不清楚的文件和文件夹。

请参阅File类中的方法来sorting或避免目录打印等。

http://java.sun.com/javase/6/docs/api/java/io/File.html

查看Apache Commons FileUtils(listFiles,iterateFiles等)。 很好的便利方法来做你想做的事情,也应用filter。

http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html

你也可以使用FileFilter接口来过滤你想要的东西。 当您创build一个实现它的匿名类时,最好使用它:

 import java.io.File; import java.io.FileFilter; public class ListFiles { public File[] findDirectories(File root) { return root.listFiles(new FileFilter() { public boolean accept(File f) { return f.isDirectory(); }}); } public File[] findFiles(File root) { return root.listFiles(new FileFilter() { public boolean accept(File f) { return f.isFile(); }}); } } 
 public static void directory (File dir) { File[] files = dir.listFiles(); for (File file : files) { System.out.println(file.getAbsolutePath()); if (file.listFiles() != null) directory(file); } } 

这里的目录是要扫描的目录。 例如c:\

可视化树结构对我来说是最方便的方法:

 public static void main(String[] args) throws IOException { printTree(0, new File("START/FROM/DIR")); } static void printTree(int depth, File file) throws IOException { StringBuilder indent = new StringBuilder(); String name = file.getName(); for (int i = 0; i < depth; i++) { indent.append("."); } //Pretty print for directories if (file.isDirectory()) { System.out.println(indent.toString() + "|"); if(isPrintName(name)){ System.out.println(indent.toString() + "*" + file.getName() + "*"); } } //Print file name else if(isPrintName(name)) { System.out.println(indent.toString() + file.getName()); } //Recurse children if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++){ printTree(depth + 4, files[i]); } } } //Exclude some file names static boolean isPrintName(String name){ if (name.charAt(0) == '.') { return false; } if (name.contains("svn")) { return false; } //. //. Some more exclusions //. return true; } 

在JDK7中,“更多的NIOfunction”应该具有将访问者模式应用于文件树或仅仅是目录的即时内容的方法 – 在迭代它们之前不需要在潜在巨大目录中find所有文件。