【问题标题】:Iterate through all files in Java遍历Java中的所有文件
【发布时间】:2012-05-28 07:18:12
【问题描述】:

我想让我的程序打印出我计算机上所有文件的巨大列表。我的问题是它只打印第一个硬盘驱动器的第一个文件夹中的文件,而我希望它打印位于我计算机上的所有文件。任何想法我在这里做错了什么?谢谢。

这是我使用的代码:

主要:

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        ArrayList<File> roots = new ArrayList();
        roots.addAll(Arrays.asList(File.listRoots()));


        for (File file : roots) {
            new Searcher(file.toString().replace('\\', '/')).search();
        }
    }
}

和 Searcher 类:

import java.io.File;

public class Searcher {

    private String root;

    public Searcher(String root) {
        this.root = root;
    }

    public void search() {
        System.out.println(root);
        File folder = new File(root);
        File[] listOfFiles = folder.listFiles();
        for (File file : listOfFiles) {
            String path = file.getPath().replace('\\', '/');
            System.out.println(path);
            if (!path.contains(".")) {
                new Searcher(path + "/").search();
            }
        }
    }
}

【问题讨论】:

标签: java file path iterator directory


【解决方案1】:

我不知道您遇到了什么错误,但我收到了 NPE,因为您没有在以下行之后检查 null。

File[] listOfFiles = folder.listFiles();

如下更改代码后,它似乎运行良好,我停止了它,因为我有很多文件。我假设它将在第一个根之后继续到下一个根(在我的情况下为 c:/)

import java.io.File;

导入 java.util.ArrayList; 导入 java.util.Arrays;

公开课搜索{

    public static void main(String[] args) {
        ArrayList<File> roots = new ArrayList();
        roots.addAll(Arrays.asList(File.listRoots()));


        for (File file : roots) {
            System.out.println(file.toString());
            new Searcher(file.toString().replace('\\', '/')).search();
        }
    }
}

类搜索器{

private String root;

public Searcher(String root) {
    this.root = root;
}

public void search() {
    System.out.println(root);
    File folder = new File(root);
    File[] listOfFiles = folder.listFiles();
    if(listOfFiles!=null)
    {
    for (File file : listOfFiles) {
        String path = file.getPath().replace('\\', '/');
        System.out.println(path);
        if (!path.contains(".")) {
            new Searcher(path + "/").search();
        }
    }
    }
}

}

【讨论】:

    【解决方案2】:
    【解决方案3】:

    如果 Java 7 是一个选项,请查看 walkFileTree() method。它将允许您访问树中的所有文件和目录,您可以从驱动器的根目录开始。只需实现一个基本的FileVisitor 来处理每个Path 的文件属性。你可以开始here

    【讨论】:

    • 您可能想要更新您的第一个超链接...“文件”页面上没有 walkFileTree() 方法。感谢您提供这个 Java 7 选项。
    【解决方案4】:

    你应该像这样更新你的搜索方法:

    public void search() {
            System.out.println(root);
            File folder = new File(root);
            File[] listOfFiles = folder.listFiles();
            for (File file : listOfFiles) {
                String path = file.getPath().replace('\\', '/');
                System.out.println(path);
                if (file.isDirectory()) {
                    new Searcher(path + "/").search();
                }
            }
        }
    

    【讨论】:

      【解决方案5】:

      我刚试过这个,它对我有用。我确实必须添加一个null 检查并更改目录评估方法:

      package test;
      
      import java.io.File;
      import java.util.ArrayList;
      import java.util.Arrays;
      
      public class Searcher {
          public static void main(String[] args) {
              ArrayList<File> roots = new ArrayList<File>();
              roots.addAll(Arrays.asList(File.listRoots()));
      
      
              for (File file : roots) {
                  new Searcher(file.toString().replace('\\', '/')).search();
              }
          }
      
          private String root;
      
          public Searcher(String root) {
              this.root = root;
          }
      
          public void search() {
              System.out.println(root);
              File folder = new File(root);
              File[] listOfFiles = folder.listFiles();
              if(listOfFiles == null) return;  // Added condition check
              for (File file : listOfFiles) {
                  String path = file.getPath().replace('\\', '/');
                  System.out.println(path);
                  if (file.isDirectory()) {
                      new Searcher(path + "/").search();
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-15
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多