Java 递归列出扩展名为.txt的所有文件

Java 递归列出扩展名为.txt的所有文件,java,file,filefilter,Java,File,Filefilter,我正在尝试递归搜索目录并列出找到的所有.txt文件。这是我的代码: private static void listFilesForFolder(File folder) throws FileNotFoundException { for (final File fileEntry : folder.listFiles()) { if (fileEntry.isDirectory()) { listFilesForFolder(fileEntry);

我正在尝试递归搜索目录并列出找到的所有.txt文件。这是我的代码:

private static void listFilesForFolder(File folder) throws FileNotFoundException {
for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry);
        } else {
            System.out.println(Arrays.toString(fileEntry.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    return pathname.getName().endsWith(".txt");
                }
            })));
        }
    }
}

我正在使用FileFilter打印所有的.txt文件,但它打印的是空文件。有人知道为什么会这样吗

我认为不必在
else
块中使用
FileFilter
,只需使用
if
语句即可。因为在这个
else
块中,您总是有一个文件(而不是目录)。查看以下更改是否适用于您

private static void listFilesForFolder(File folder) throws FileNotFoundException
{
  for (final File fileEntry : folder.listFiles()) {
    if (fileEntry.isDirectory()) {
      listFilesForFolder(fileEntry);
    } else {
      if (fileEntry.getPath().toLowerCase().endsWith(".txt")) {
        System.out.println(fileEntry.getPath());
      }
      /*System.out.println(Arrays.toString(fileEntry.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
          return pathname.getName().endsWith(".txt");
        }
      })));*/
    }
  }
}
编辑:
如果确实想使用
FileFilter
执行此操作,可以这样做:

private static void listFilesForFolder2(File folder) throws FileNotFoundException
{
  File[] textFiles = folder.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
      return pathname.isFile() && pathname.getName().toLowerCase().endsWith(".txt");
    }
  });
  if (textFiles != null) {
    for (File f : textFiles) {
      System.out.println(f.getPath());
    }
  }

  for (final File fileEntry : folder.listFiles()) {
    if (fileEntry.isDirectory()) {
      listFilesForFolder2(fileEntry);
    }
  }
}
for (final File fileEntry : folder.listFiles()) {
    if (fileEntry.isDirectory()) {
        listFilesForFolder(fileEntry);
    } else {
        if (fileEntry.getName().endsWith(".txt")) {
            System.out.println(fileEntry.getName());
        }
    }
}

只有当
文件
对象是
目录
对象时,方法
file.listFiles()
才返回
字符串[]
,如果
文件
对象是
文件
对象,它将返回null。您可以这样修改代码:

private static void listFilesForFolder2(File folder) throws FileNotFoundException
{
  File[] textFiles = folder.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
      return pathname.isFile() && pathname.getName().toLowerCase().endsWith(".txt");
    }
  });
  if (textFiles != null) {
    for (File f : textFiles) {
      System.out.println(f.getPath());
    }
  }

  for (final File fileEntry : folder.listFiles()) {
    if (fileEntry.isDirectory()) {
      listFilesForFolder2(fileEntry);
    }
  }
}
for (final File fileEntry : folder.listFiles()) {
    if (fileEntry.isDirectory()) {
        listFilesForFolder(fileEntry);
    } else {
        if (fileEntry.getName().endsWith(".txt")) {
            System.out.println(fileEntry.getName());
        }
    }
}
如果您可以使用apache commons io,则可以很容易地使用
IOFileFilter
过滤您想要的内容:

    FileUtils.listFiles(folder, new IOFileFilter() {
        @Override
        public boolean accept(File file) {
            return file.getName().endsWith(".txt");
        }

        @Override
        public boolean accept(File file, String s) {
            return true;
        }
    }, new IOFileFilter() {
        @Override
        public boolean accept(File file) {
            return true;
        }

        @Override
        public boolean accept(File file, String s) {
            return true;
        }
    }).stream().forEach(file -> System.out.println(file.getName()));

在您的代码
listFilesForFolder(fileEntry)中不是递归调用。因为你展示的这个方法没有把一个
文件作为一个参数。我编辑了这篇文章,但问题仍然存在。你知道为什么吗?当
fileEntry
不是目录时,你相信
fileEntry.listFiles(…)
会做什么,你为什么相信根据javadoc:“如果这个抽象路径名不表示目录,那么这个方法返回null”。这就是它打印空值的原因。这可能是一个更好的开始,这是一个伟大的解决方案!但是您知道如何将FileFilter合并到函数中吗?请记住,文件扩展名也可以是大写。@DevilsHnd,谢谢。我添加了
toLowerCase()
来处理这个问题。