在Java中,如何仅列出目录中的子目录?
我想使用java.io.File功能,Java中执行此操作的最佳方法是什么?
在Java中,如何仅列出目录中的子目录?
我想使用java.io.File功能,Java中执行此操作的最佳方法是什么?
Answers:
您可以使用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();
}
ArrayList<File> directories = new ArrayList<File>(
Arrays.asList(
new File("your/path/").listFiles(File::isDirectory)
)
);
对于也对Java 7和NIO感兴趣的用户,可以使用上述@voo答案的替代解决方案。我们可以使用调用的try-with-resourcesFiles.find()
和用于过滤目录的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) {
...
}
我们甚至可以通过更改lambda函数来按名称过滤目录:
(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
我想使用java.io.File功能,
是的,在2012年(问题的日期),今天不是。 java.nio
对于此类要求,必须优先使用API。
有这么多答案很糟糕,但是我使用的简单方法不是Files.walk().filter().collect()
。
在全球范围内,两种方法都是可行的:
1)Files.walk(Path start, )
没有maxDepth
限制,而
2)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
}
如果由于遗留原因,您需要获取List,File
可以map(Path::toFile)
在collect之前添加一个操作:
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)
。
Files.list(Path)
如果我们不想递归地迭代文件夹,@ David L确实是一个不错的选择。以递归方式迭代文件夹,比较walk()
合适。
答案列表中缺少对我有用的解决方案。因此,我在这里发布此解决方案:
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
给定一个起始目录 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!");
}