[请提出一个好的Java解决方案,如何在控制台的java.nio.file.Path中设置漂亮的打印。例如:路径:
/src/test/resources/TestFolder/Wave.java
/src/test/resources/TestFolder
/src/test/resources/TestFolder/Mello.java
/src/test/resources/TestFolder/TestFolder2/Dave2.java
/src/test/resources/TestFolder/TestFolder2/Hello2.java
/src/test/resources/TestFolder/TestFolder2
和预期结果:
TestFolder
Wave.java
Mello.java
TestFolder2
Dave2.java
Hello2.java
没有内置的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
(如果需要它作为字符串,只需在path对象上调用toString()
即可得到) )。
StringBuilder类可用于逐段生成更长的字符串。
如果您有一个表示“嵌套级别”的整数,则在您的示例中,您希望文件名前有一堆空格等于该空格的倍数。您可以使用repeat
调用将数字转换为包含该空格数的字符串:String prefix = " ".repeat(5);
生成包含10个空格的字符串。
NB:这是较新的API;如果您使用的是Java的旧版本,并且此调用不起作用,则必须自己编写。这只是一个for循环。
要知道给定的文件是否为目录,可以调用该目录;如果为true,则返回true,否则为false。
这是“遍历”文件系统的一种方法:这使您可以列出给定目录中的每个目录/文件:
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开始)的间隔符,然后简单文件名,然后转到下一个条目。对于目录条目,您要这样做,然后“潜入”目录,从而增加嵌套级别。如果将嵌套级别作为参数,则可以调用自己的方法,将目录用作新的“根点”,并为嵌套级别传递“ nestingLevel + 1”。