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

时间:2019-01-26 01:36:31

标签: java file filefilter

我试图递归搜索目录并列出所有找到的.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文件,但它打印的是null。有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

我认为您可以使用FileFilter语句来代替在else块中使用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);
    }
  }
}

答案 1 :(得分:0)

仅当file.listFiles()对象是String[]对象时,方法file返回Directory,如果fileFile对象,则方法for (final File fileEntry : folder.listFiles()) { if (fileEntry.isDirectory()) { listFilesForFolder(fileEntry); } else { if (fileEntry.getName().endsWith(".txt")) { System.out.println(fileEntry.getName()); } } } 返回null。您可以像这样修改您的代码:

IOFileFilter

如果您可以使用apache commons-io,则很容易使用 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())); 来过滤所需的内容:

[redis]