Подтвердить что ты не робот

Java, список только подкаталогов из каталога, а не файлов

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

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

4b9b3361

Ответ 1

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

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?

В принципе:

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

Ответ 2

Очень простое решение для 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();
    }
});

Ответ 3

@Mohamed Mansour, вы были почти там... аргумент "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));

Ответ 4

Если вас интересует решение с использованием 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();
    }

Ответ 5

Для тех, кто также интересуется 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

Ответ 6

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

  • Создайте метод, который принимает путь String в качестве параметра. В методе:
  • Создайте новый объект File на основе стартового каталога
  • Получить массив файлов в текущем каталоге с помощью метода listFiles
  • Перебирать массив файлов
    • Если это файл, продолжите цикл
    • Если это каталог, распечатайте имя и рекурсию на этом новом пути к каталогам

Ответ 7

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

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!");
        }

Ответ 8

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

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.

Ответ 9

ArrayList<File> directories = new ArrayList<File>(
    Arrays.asList(
        new File("your/path/").listFiles(File::isDirectory)
    )
);