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 } }