В Java, как мне отобразить только подкаталоги из каталога?
Я хотел бы использовать функциональность java.io.File, какой лучший метод в Java для этого?
В Java, как мне отобразить только подкаталоги из каталога?
Я хотел бы использовать функциональность java.io.File, какой лучший метод в Java для этого?
Вы можете использовать класс 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 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();
}
});
@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));
Если вас интересует решение с использованием 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();
}
Для тех, кто также интересуется 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
Учитывая начальный каталог как String
String
в качестве параметра. В методе:listFiles
Вот решение для моего кода. Я только что сделал небольшое изменение с первого ответа. Это будет перечислять все папки только в нужном каталоге построчно:
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!");
}
Решение, которое сработало для меня, отсутствует в списке ответов. Поэтому я публикую это решение здесь:
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.
ArrayList<File> directories = new ArrayList<File>(
Arrays.asList(
new File("your/path/").listFiles(File::isDirectory)
)
);