2008-10-09 115 views
54

如何在Java中递归地列出文件夹中的所有文件?如何在Java中扫描文件夹?

+0

TREE是什么意思?如果您正在寻找一种方法来列出文件夹中的所有文件(递归),请更改您的问题。 – 2012-05-08 10:10:21

+0

@PeterPerháč这个问题是4岁.. :)谢谢 – Lipis 2012-05-08 11:58:31

回答

62

不知道要如何表示的树?无论如何,这里是一个使用递归扫描整个子树的例子。文件和目录被视为一样。请注意,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); 
      } 
     } 
    } 
} 

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

的Java 7还提供了一个tree walker

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; 
     } 
    }); 
} 
21
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()); 
     } 
    } 
} 

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

见文件类的方法对它们进行排序或避免目录打印等

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

18

退房阿帕奇共享文件实用程序(listFiles,iterateFiles等)。不错的便利方法可以做你想做的事情,也可以使用过滤器。

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

+2

有没有什么比吸吮庞大的图书馆来解决问题更慢,否则可能会解决10行代码。 – stu 2011-06-27 18:24:32

+11

雅,我讨厌使用已经过测试的库,它们包含超过10行的函数。 – cmcginty 2012-02-23 22:47:28

0

在JDK7,“更NIO的功能”应该有方法在文件树应用访问者模式或只是一个目录的即时内容 - 无需在遍历它们之前,查找潜在巨大目录中的所有文件。

6

您也可以使用FileFilter界面来筛选出你想要的。

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(); 
      }}); 
    } 
} 
1

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

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; 
} 
2
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);   
    } 
} 

这里dir是要扫描目录,当你创建一个实现它的匿名类,最好使用。例如c:\