在Java中,如何列出目录下仅包含子目录的内容?
我想使用java.io.File功能,那么在Java中怎样做最好呢?
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();
}
});
::
在这个例子中是如何工作的? - snickers10m@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();
}
ArrayList<File> directories = new ArrayList<File>(
Arrays.asList(
new File("your/path/").listFiles(File::isDirectory)
)
);
这将列出(即打印)所有子目录。它基本上是一种循环,你不需要将项目存储到列表中间。这是大多数人最需要的,所以我在这里留下它。
Path directory = Paths.get("D:\\directory\\to\\list");
Files.walk(directory, 1).filter(entry -> !entry.equals(directory))
.filter(Files::isDirectory).forEach(subdirectory ->
{
// do whatever you want with the subdirectories
System.out.println(subdirectory.getFileName());
});
Files.walk().filter().collect()
。Files.walk(Path start, )
没有maxDepth
限制;Files.walk(Path start, int maxDepth, FileVisitOption... options)
允许设置深度限制。Path directory = Paths.get("/foo/bar");
try {
List<Path> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
如果因为遗留原因,你需要获取一个File
列表,那么你只需要在收集之前添加一个map(Path::toFile)
操作:
Path directory = Paths.get("/foo/bar");
try {
List<File> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.map(Path::toFile)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Files.list(Path)
,可能与Files.walk(Path,1)
相同。 - David L.Files.list(Path)
是一个不错的选择。要递归迭代文件夹,最好使用walk()
。 - davidxxxFiles.find()
的try-with-resources和一个用于过滤目录的lambda函数。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
File files = new File("src");
// src is folder name...
//This will return the list of the subDirectories
List<File> subDirectories = Arrays.stream(files.listFiles()).filter(File::isDirectory).collect(Collectors.toList());
// this will print all the sub directories
Arrays.stream(files.listFiles()).filter(File::isDirectory).forEach(System.out::println);
这是我的代码解决方案。我只做了一个小改动来自第一个答案。这将逐行列出所需目录中的所有文件夹:
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!");
}