使用堆栈在Java中制作文件/目录树

Posted

技术标签:

【中文标题】使用堆栈在Java中制作文件/目录树【英文标题】:Using stack to make file/directory tree in Java 【发布时间】:2018-10-16 10:36:40 【问题描述】:

我需要使用堆栈数据结构返回或打印文件/目录树。例如:

Folder1
    Folder1.1
        File1.1.1
    Folder1.2
Folder2
    File2.1
    File2.2
...

到目前为止我的代码:

public static void filetree(File mainfolder, int indent)

    Stack<String> filesanddirectories = new Stack<>();

        for (File file : mainfolder.listFiles())
            if (file.isDirectory())
                filesanddirectories.push(file.getName());
                filetree(file, 0);
            
            else if (file.isFile())
                filesanddirectories.push(file.getName());
            
        

    for (int i = 0; i < filesanddirectories.size(); i++)
        System.out.println(filesanddirectories.pop());
    

此代码打印文件夹和文件,但没有缩进,向后并且不完全按照正确的顺序。

有人能解释一下它应该如何工作的逻辑吗?

编辑:找到使用递归和堆栈的解决方案(虽然堆栈似乎是不必要的)

【问题讨论】:

要使缩进工作,您需要在每次递归时向 indent 值添加一些内容 - 例如 filetree(file, 0); -> filetree(file, indent + 4);。然后,您需要更改打印机制以使用 indent 值。 要正确打印文件名,您需要在看到文件名时打印它们。 if (file.isFile())filesanddirectories.push(file.getName()); -> if (file.isFile())System.out.println(.... 那么打印文件和文件夹并将文件夹添加到堆栈? 你应该用递归的方法打印出来 当你有一个递归方法时使用堆栈是有点不寻常的。您确定必须使用堆栈吗? 【参考方案1】:

在递归遍历文件目录时,我使用了indenttemp 变量来保持缩进。然后在for 循环的开始处打印缩进。

public static void filetree(File mainfolder, int indent) 

        int temp;

        for (File file : mainfolder.listFiles()) 
            for(int i = 0; i<indent; i++) 
                System.out.print("  ");
            
            temp = indent;
            if (file.isDirectory()) 

                indent++;
                System.out.println(file.getName()); 

                filetree(file, indent);
                indent--;

             else if (file.isFile()) 

                System.out.println(file.getName());
                indent = temp;
             
        
    

【讨论】:

如果你永远不会弹出它们,那么将它们压入堆栈有什么意义? filesanddirectories.push(file.getName()); 在 OP 的代码中,我只是没有删除这些行。使用堆栈对解决方案没有任何贡献。也许我应该更新我的答案。

以上是关于使用堆栈在Java中制作文件/目录树的主要内容,如果未能解决你的问题,请参考以下文章

java 使用文件库递归复制目录树

java 目录树:用JTree实现d盘的目录树?java高手进

Win10怎么把文件夹目录树变文本?

制作安卓PDF阅读器:七、实现多实例打开、文档目录树

该模型以熟悉的文件系统目录树结构

如何使用 JAVA 将 B+ 树保存在文件中