【问题标题】:Java nio, get all subfolders of some folderJava nio,获取某个文件夹的所有子文件夹
【发布时间】:2016-11-11 03:58:00
【问题描述】:

如何获取某个文件夹的所有子文件夹?我会使用 JDK 8 和 nio。

picture

例如,对于文件夹“Designs.ipj”,方法应返回 {"Workspace", "Library1"}

提前谢谢你!

【问题讨论】:

  • 您应该编辑您的帖子并将图片包含在您的问题中。最终,外部链接在某些时候变得不可用,从而阻止未来的用户从您的问题中受益。
  • hmmm 你需要非阻塞 IO 吗?
  • 我的评分太低,无法添加图片。

标签: java nio


【解决方案1】:
    List<Path> subfolder = Files.walk(folderPath, 1)
            .filter(Files::isDirectory)
            .collect(Collectors.toList());

它将包含folderPath和深度1的所有子文件夹。如果您只需要子文件夹,只需添加:

subfolders.remove(0);

【讨论】:

  • DirectoryStream 路径 = Files.newDirectoryStream(folder, entry -> Files.isDirectory(entry));更短
【解决方案2】:

您必须读取文件夹中的所有项目并过滤掉目录,并根据需要多次重复此过程。

为此,您可以使用 listFiles()

File folder = new File("your/path");
Stack<File> stack = new Stack<File>();
Stack<File> folders = new Stack<File>();

stack.push(folder);
while(!stack.isEmpty())
    {
        File child = stack.pop();
        File[] listFiles = child.listFiles();
        folders.push(child);

        for(File file : listFiles)
        {
            if(file.isDirectory())
            {
                stack.push(file);
            }
        }            
    }

Getting the filenames of all files in a folder 一个简单的递归函数也可以,只是要小心无限循环。

不过,我更偏爱 DirectoryStream。它允许您创建一个过滤器,以便您只添加符合您的规格的项目。

DirectoryStream.Filter<Path> visibleFilter = new DirectoryStream.Filter<Path>()
{
    @Override
    public boolean accept(Path file)
    {
        try
        {
            return Files.isDirectory(file));
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }

        return false;
}

try(DirectoryStream<Path> stream = Files.newDirectoryStream(directory.toPath(), visibleFilter))
{
    for(Path file : stream)
    {
        folders.push(child);
    }
}

【讨论】: