列出Java中目录和子目录中的所有文件

Adn*_*nan 29 java directory

列出1000多个目录和子目录中文件名的最快方法是什么?

编辑; 我使用的当前代码是:

import java.io.File;

public class DirectoryReader {

  static int spc_count=-1;

  static void Process(File aFile) {
    spc_count++;
    String spcs = "";
    for (int i = 0; i < spc_count; i++)
      spcs += " ";
    if(aFile.isFile())
      System.out.println(spcs + "[FILE] " + aFile.getName());
    else if (aFile.isDirectory()) {
      System.out.println(spcs + "[DIR] " + aFile.getName());
      File[] listOfFiles = aFile.listFiles();
      if(listOfFiles!=null) {
        for (int i = 0; i < listOfFiles.length; i++)
          Process(listOfFiles[i]);
      } else {
        System.out.println(spcs + " [ACCESS DENIED]");
      }
    }
    spc_count--;
  }

  public static void main(String[] args) {
    String nam = "D:/";
    File aFile = new File(nam);
    Process(aFile);
  }

}
Run Code Online (Sandbox Code Playgroud)

Aks*_*ert 33

由于这个答案显示在google之上,我正在添加一个用于列出所有文件和目录的java 7 nio解决方案,它在我的系统上花费的时间减少了大约80%.

try {
    Path startPath = Paths.get("c:/");
    Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
        @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) {
            System.out.println("File: " + file.toString());    
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException e) {
            return FileVisitResult.CONTINUE;
        }
    });
} catch (IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)


Rom*_*eau 9

这看起来很好(递归遍历目录)瓶颈将是你需要做的所有文件i/o,优化你的Java将不会显示任何真正的改进.


Ale*_*yak 5

唯一的改进是摆脱static spc_count并将spcs字符串作为参数传递给Process.

public static void main(String[] args) {
  String nam = "D:/";
  File aFile = new File(nam);
  Process("", aFile);
}
Run Code Online (Sandbox Code Playgroud)

在做递归调用时,做

static void Process( String spcs, File aFile) {
  ...
  Process(spcs + " ", listOfFiles[i]);
  ...
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以从多个线程调用此方法.