代码之家  ›  专栏  ›  技术社区  ›  Adnan

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

  •  29
  • Adnan  · 技术社区  · 16 年前

    列出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);
      }
    
    }
    
    6 回复  |  直到 16 年前
        1
  •  9
  •   Romain Hippeau    16 年前

    这看起来不错(递归地遍历目录)瓶颈将是您需要执行的所有文件i/o,优化Java不会显示任何真正的改进。

        2
  •  33
  •   Aksel Willgert    13 年前

    当这个答案出现在google上面时,我添加了一个java7nio解决方案来列出所有的文件和目录,在我的系统上花费的时间减少了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();
    }
    
        3
  •  5
  •   Alexander Pogrebnyak    16 年前

    唯一的改进就是摆脱 static spc_count spcs 字符串作为要处理的参数。

    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]);
      ...
    }
    

        4
  •  4
  •   Powerlord    16 年前

    直到Java7引入新的 java.nio.file DirectoryStream ),恐怕你已经拥有的将是最快的。

        5
  •  4
  •   Peter    13 年前
        6
  •  -1
  •   Abhishek Gurjar    8 年前

    我写了一个简单得多的代码…试试这个。。。它将显示每个文件夹,子文件夹和文件。。。

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