Java, список только подкаталогов из каталога, а не файлов - PullRequest
84 голосов
/ 26 февраля 2011

В Java, как мне перечислить только подкаталоги из каталога?

Я хотел бы использовать функциональность java.io.File, какой метод Java лучше всего подходит для этого?

Ответы [ 9 ]

122 голосов
/ 26 февраля 2011

Вы можете использовать класс Файл для перечисления каталогов.

File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
  @Override
  public boolean accept(File current, String name) {
    return new File(current, name).isDirectory();
  }
});
System.out.println(Arrays.toString(directories));

Обновление

Требуется комментарий автора к этому сообщениюболее быстрый способ, большое обсуждение здесь: Как быстро получить список каталогов в Java?

В основном:

  1. Если вы управляете структурой файлов, япопытался бы избежать попадания в эту ситуацию.
  2. В Java NIO.2 вы можете использовать функцию каталогов, чтобы вернуть итератор, чтобы обеспечить большее масштабирование.Класс потока каталога - это объект, который можно использовать для перебора записей в каталоге.
94 голосов
/ 14 января 2015

Очень простое решение Java 8:

File[] directories = new File("/your/path/").listFiles(File::isDirectory);

Это эквивалентно использованию FileFilter (также работает со старым Java):

File[] directories = new File("/your/path/").listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isDirectory();
    }
});
14 голосов
/ 20 августа 2011

@ Мохамед Мансур, вы почти были там ... аргумент "dir", который вы использовали, на самом деле является текущим путем, поэтому он всегда будет возвращать true.Чтобы увидеть, является ли дочерний каталог подкаталогом или нет, вам нужно проверить этого ребенка.

File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
  @Override
  public boolean accept(File current, String name) {
    return new File(current, name).isDirectory();
  }
});
System.out.println(Arrays.toString(directories));
7 голосов
/ 13 июля 2013

Если вам интересно решение с использованием Java 7 и NIO.2, оно может выглядеть следующим образом:

private static class DirectoriesFilter implements Filter<Path> {
    @Override
    public boolean accept(Path entry) throws IOException {
        return Files.isDirectory(entry);
    }
}

try (DirectoryStream<Path> ds = Files.newDirectoryStream(FileSystems.getDefault().getPath(root), new DirectoriesFilter())) {
        for (Path p : ds) {
            System.out.println(p.getFileName());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
1 голос
/ 10 июня 2019
ArrayList<File> directories = new ArrayList<File>(
    Arrays.asList(
        new File("your/path/").listFiles(File::isDirectory)
    )
);
1 голос
/ 02 августа 2018

Для тех, кто также интересуется Java 7 и NIO, есть альтернативное решение для ответа @ voo выше . Мы можем использовать try-with-resources , который вызывает Files.find(), и лямбда-функцию, которая используется для фильтрации каталогов.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;


final Path directory = Paths.get("/path/to/folder");

try (Stream<Path> paths = Files.find(directory, Integer.MAX_VALUE, (path, attributes) -> attributes.isDirectory())) {
    paths.forEach(System.out::println);
} catch (IOException e) {
    ...
}

Мы можем даже отфильтровать каталоги по имени, изменив лямбда-функцию:

(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")

или по дате:

final long now = System.currentTimeMillis();
final long yesterday = new Date(now - 24 * 60 * 60 * 1000L).getTime();

// modified in the last 24 hours
(path, attributes) -> attributes.isDirectory() && attributes.lastModifiedTime().toMillis() > yesterday
0 голосов
/ 15 марта 2019

Решение, которое сработало для меня, отсутствует в списке ответов. Поэтому я публикую это решение здесь:

File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());

Здесь я использовал org.apache.commons.io.filefilter.FileFilterUtils из Apache commons-io-2.2.jar. Его документация доступна здесь: https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html

0 голосов
/ 29 апреля 2018

Вот решение для моего кода.Я только что сделал небольшое изменение с первого ответа .Это будет перечислять все папки только в нужном каталоге построчно:

try {
            File file = new File("D:\\admir\\MyBookLibrary");
            String[] directories = file.list(new FilenameFilter() {
              @Override
              public boolean accept(File current, String name) {
                return new File(current, name).isDirectory();
              }
            });
            for(int i = 0;i < directories.length;i++) {
                if(directories[i] != null) {
                    System.out.println(Arrays.asList(directories[i]));

                }
            }
        }catch(Exception e) {
            System.err.println("Error!");
        }
0 голосов
/ 26 февраля 2011

Учитывая начальный каталог как String

  1. Создайте метод, который принимает путь String в качестве параметра. В методе:
  2. Создать новый Файл объект на основе начального каталога
  3. Получить массив файлов в текущем каталоге, используя метод listFiles
  4. Цикл по массиву файлов
    1. Если это файл, продолжайте цикл
    2. Если это каталог, распечатайте имя и recurse по этому новому пути к каталогу
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...