有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何计算目录和子目录中的大量文件(如根C://或D://)

我正在写一个代码来计算文件夹及其子文件夹中具有特定扩展名的文件。当我从中小型文件夹计数时,这段代码运行良好

如果我从根开始计数,问题就开始了,例如从D://。它将持续一段时间,但在中间停止。我假设代码不能有效地读取大量文件和文件夹

public static int countFiles(File directory, String ext) {
    int count = 0;

    for(File file : directory.listFiles()) {
        System.out.println(file);
        if(file.isDirectory()) {
            count += countFiles(file, ext); 
        }
     String textFile = file.toString();
     if(textFile.endsWith(ext)){
         count++;
     }
    }

出现错误

enter image description here

屏幕截图行错误

enter image description here


共 (2) 个答案

  1. # 1 楼答案

    我只需在countFiles的开头检查null

    public int countFiles(File directory, String... exts) {
      if (directory == null) return 0;
    

    如果要对整个文件系统进行大规模递归扫描,则在调用countFiles(file, exts);和调用directory.listFiles()之间,目录可能不再存在

  2. # 2 楼答案

    我认为正在发生的是directory.listFiles()返回null

    尽管文档中没有提到,但如果您没有足够的访问权限列出目录内容,可能会发生这种情况。如下图所示,您可以非常轻松地修复此问题

    此外,还有一个轻微的逻辑错误(例如)一个名为Files ending with .xls的目录也可以算作一个文件,而它显然不是。我也解决了这个问题

    public int countFiles(File directory, String... exts) {
      int count = 0;
      File[] files = directory.listFiles();
      if (files != null) {
        for (File file : files) {
          if (file.isDirectory()) {
            count += countFiles(file, exts);
          } else {
            String textFile = file.toString();
            for (String ext : exts) {
              if (textFile.endsWith(ext)) {
                count++;
              }
            }
          }
        }
      }
      return count;
    }