Java,仅列出目录中的子目录,而不是文件

Lok*_*kar 92 java file

在Java中,如何仅列出目录中的子目录?

我想使用java.io.File功能,Java中最好的方法是什么?

Moh*_*our 125

您可以使用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));
Run Code Online (Sandbox Code Playgroud)

更新

作者对这篇文章的评论想要一个更快的方法,这里有很好的讨论: 如何在Java中快速检索目录列表?

基本上:

  1. 如果您控制文件结构,我会尽量避免陷入这种情况.
  2. 在Java NIO.2中,您可以使用目录函数返回迭代器以允许更大的缩放.目录流类是一个对象,可用于迭代目录中的条目.


hea*_*svk 101

一个非常简单的Java 8解决方案:

File[] directories = new File("/your/path/").listFiles(File::isDirectory);
Run Code Online (Sandbox Code Playgroud)

它等同于使用FileFilter(也适用于旧Java):

File[] directories = new File("/your/path/").listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isDirectory();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 双冒号`::`在这个实例中是如何工作的? (4认同)

Jav*_*zzi 14

@Mohamed Mansour你几乎就在那里......你正在使用的"dir"论证实际上是一条前沿的道路,所以它总是会回归真实.为了查看孩子是否是子目录,您需要测试该孩子.

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));
Run Code Online (Sandbox Code Playgroud)


voo*_*voo 7

如果您对使用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();
    }
Run Code Online (Sandbox Code Playgroud)