没有内置的 API 调用可以做到这一点。幸运的是,Java 是一种编程语言,而您是一名程序员。让我们编程吧! :)
您需要的工具:
相对化或获取文件名
您可以使用relativize 调用来生成相对于“根点”的路径。例如:
Paths.get("/src/test/resources").relativize(Paths.get("/src/test/resources/TestFolder/Mello.java"))
变成表示:TestFolder/Mello.java的路径。
但是,也许您希望输出中的每个条目始终只是一个文件名;在这种情况下,getFileName() 调用会去除除最后一个之外的所有路径元素:Paths.get("/src/test/resources/TestFolder/TestFolder2/Hello2.java").getFileName() 生成仅包含 Hello2.java 的路径(如果您需要将其作为字符串,只需在路径对象上调用 toString() 即可获得该路径)。
字符串生成器
StringBuilder 类可用于逐段生成更长的字符串。
重复
如果您有一个表示“嵌套级别”的 int,则在您的示例中,您希望文件名前面有一堆空格,等于它的某个倍数。您可以使用 repeat 调用将数字转换为包含该数量空格的字符串:String prefix = " ".repeat(5); 生成包含 10 个空格的字符串。
注意:这是一个较新的 API;如果您使用的是旧版本的 java 并且此调用不起作用,则必须自己编写。这只是一个 for 循环。
Files.isDirectory
>
要知道任何给定文件是否是目录,您可以调用它;如果是则返回 true,否则返回 false。
Files.newDirectoryStream
这是“遍历”文件系统的一种方法:这使您可以列出给定目录中的每个目录/文件:
Path somePathObject = Paths.get("/foo/bar");
try (var contents = Files.newDirectoryStream(somePathObject)) {
for (Path content : contents) {
.. this is called once for each file/dir in '/foo/bar'
}
}
递归
最后,将它们联系在一起:您希望在给定起点遍历每个子节点,如果它是一个文件,则打印与我们的嵌套级别(从 0 开始)相等的间隔数,然后简单的文件名,然后继续下一个条目。对于目录条目,您希望这样做,然后“潜入”目录,增加嵌套级别。如果将嵌套级别作为参数,则可以调用自己的方法,将目录用作新的“根点”,并为嵌套级别传递“嵌套级别 + 1”。
祝你好运,玩得开心!