面试题:JAVA实现Linux tree打印目录树的简单功能

import java.io.File;

public class DirectoryPrint {
    public static void main(String[] args) {
        String path = "E:\\workspacesgit\\Java8InAction";
        printDirectory(path, false, "", "", 0);
    }

    /**
     * Linux命令tree用于打印出目录树,其输出的格式如下所示:
     *
     * .
     * ├── README.md
     * ├── app
     * │   ├── build.gradle.kts
     * │   └── src
     * ├── build.gradle.kts
     * ├── buildSrc
     * ├── core
     * │   ├── build.gradle.kts
     * │   └── src
     * │       ├── main
     * │       │   └── java
     * │       │       └── com
     * │       │           └── hosecloud
     * │       │               └── tiangong
     * │       │                   └── datamigration
     * │       │                       ├── BatchConfig.java
     * │       │                       ├── CollectionConfig.java
     * │       │                       ├── Migration.java
     * │       │                       ├── SpecialValue.java
     * │       │                       ├── SqlExecutor.java
     * │       │                       ├── TableConfig.java
     * │       │                       ├── TransformConfig.java
     * │       │                       └── impl
     * │       │                           ├── BatchJob.java
     * │       │                           ├── DefaultRow.java
     * │       │                           ├── JsTransformer.java
     * │       │                           ├── NoStacktraceException.java
     * │       │                           ├── NoopConnector.java
     * │       │                           ├── TableConnector.java
     * │       │                           └── VersionFilter.java
     * │       ├── test
     * │       └── testFixtures
     * ├── gradle
     * ├── gradlew
     * ├── gradlew.bat
     * ├── infra-client
     * │   ├── build.gradle.kts
     * │   └── src
     * ├── infra-db
     * │   ├── build.gradle.kts
     * │   └── src
     * ├── settings.gradle.kts
     * └── versions.properties
     *
     * 请仿照上述格式编写一个打印目录树的java程序。
     * 思路: 分三段去考虑:
     *      1.前半截路径上:如果还有兄弟节点,则要用竖线一直往下连起来,否则直接用空格。
     *      2.贴近文件名的是├──还是└── , 根据是否有兄弟节点判断。
     *      3.文件名:直接加上去就好了。
     *
     * result string = prefix + nearestPrefix + fileName
     * @param path 文件绝对路径
     * @param hasSibling 是否还有兄弟节点
     * @param nearestPrefix 离文件名最近的是├──还是└──
     * @param prefix 前面的路径占位符字符串,通过递归累积起来
     * @param depth 深度,用于做一些特殊的判断,比如判断第一层不用缩进了
     */
    public static void printDirectory(String path, boolean hasSibling, String nearestPrefix, String prefix, int depth) {

        File file  =  new File(path);
        String fileName = file.getName();
        //resultString = prefix + nearestPrefix + fileName
        System.out.println(prefix + nearestPrefix + fileName);

        // 如果是目录,递归打印下一级
        if(file.isDirectory()) {
            if(hasSibling) {// 还有兄弟节点,需要加竖线
                prefix = prefix + "│  ";
            } else {
                if(depth != 0) { // 第一级不缩进
                    prefix = prefix + "   ";
                }
            }

            depth++;// 还有下一层,计数加一
            File[] fa = file.listFiles();
            for(int num = 0; num < fa.length; num ++) {// 需要判断是否是本层级最后一个
                File f = fa[num];
                if(num == fa.length - 1) {
                    printDirectory(f.getPath(), false, "└──", prefix, depth);
                } else {
                    printDirectory(f.getPath(), true, "├──", prefix, depth);
                }

            }
        } // if(file.isDirectory()) end
    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值