Перечисление всех файлов с расширением .txt рекурсивно - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь рекурсивно искать в каталоге и перечислять все найденные 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, но вместо этого он выводит ноль.Кто-нибудь знает, почему это так?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Метод file.listFiles() возвращает String[] только тогда, когда объект file является объектом Directory, если file является объектом File, он возвращает ноль.Вы можете просто изменить свой код следующим образом:

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()));
0 голосов
/ 26 января 2019

Я думаю, что вместо использования 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);
    }
  }
}
...