在Java中列出所有目录及其子目录中的文件。

31

如何以最快的方式列出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);
  }

}

你所说的“最快”是指什么?是编码最简单,对某个操作系统性能最佳,还是针对特定目录结构性能最佳? - Peter Recore
在我的情况下,为了在WinXP上运行快速且尽可能简单。 - Adnan
点赞,因为这是一个常见的用例,它确实帮助了我。 - Redandwhite
6个回答

36

由于这个答案在谷歌排名靠前,我添加了一个 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();
}

9

这看起来很好(递归遍历目录),瓶颈将是您需要进行的所有文件I/O操作,优化Java将不会显示任何真正的改进。


5
唯一的改进就是摆脱static spc_count,并将spcs字符串作为参数传递到Process中。
public static void main(String[] args) {
  String nam = "D:/";
  File aFile = new File(nam);
  Process("", aFile);
}

当进行递归调用时,请执行以下操作:

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

这样你就可以从多个线程中调用此方法。


谢谢您的提示,@Alexander Pogrebnyak。 - Adnan

4

4

-1

我写了一个更简单的代码...试试这个...它会显示每个文件夹、子文件夹和文件...

 int Files=0,Directory=0,HiddenFiles=0,HiddenDirectory=0;

 public void listf(String directoryName){

File file=new File(directoryName);

File[] fileList=file.listFiles();

if(fileList!=null){

for(int i=0;i<fileList.length;i++){

if(fileList[i].isHidden()){

if(fileList[i].isFile())

{

   System.out.println(fileList[i]);

HiddenFiles++;

}

else{

  listf(String.valueOf(fileList[i]));

  HiddenDirectory++;

}

}

else if (fileList[i].isFile()) {

//System.out.println(fileList[i]);

Files++;

}

else if(fileList[i].isDirectory()){

Directory++;

listf(String.valueOf(fileList[i]));

}

}

}

}



public void Numbers(){

   System.out.println("Files: "+Files+" HiddenFiles: "+HiddenFiles+"Hidden Directories"+HiddenDirectory+" Directories: "+Directory);`

    }  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接