Нет встроенного вызова API, который бы делал это. К счастью, Java - это язык программирования, а вы программист. Давайте запрограммируем это! :)
Необходимые инструменты:
релятивизировать или getFileName
Вы можете использовать вызов relativize
для создания путей, относящихся к точке 'root ». Например:
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
Класс StringBuilder может использоваться для создания более длинной строки по частям.
repeat
If у вас есть int, представляющий ваш «уровень вложенности», в вашем примере вы хотите, чтобы перед именем файла была группа пробелов, равная некоторому кратному этому. Вы можете использовать вызов repeat
, чтобы превратить число в строку, содержащую это количество пробелов: String prefix = " ".repeat(5);
создает строку, содержащую 10 пробелов.
Примечание: это несколько более новый API; если вы используете старую версию java и этот вызов не работает, вам придется написать его самостоятельно. Это просто сингл для l oop.
Files.isDirectory
Чтобы узнать, является ли какой-либо данный файл каталогом, вы можете вызвать его; он возвращает истину, если это так, и ложь, если это не так.
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'
}
}
рекурсия
Наконец, к t ie все вместе: вы хотите пройтись по каждому дочернему элементу в заданной начальной точке, если это файл напечатайте количество разделителей, равных нашему уровню вложенности (который начинается с 0), затем простое имя файла, а затем перейдите к следующей записи. Для записей каталога вы хотите сделать это, но затем «погрузиться» в каталог, увеличив уровень вложенности. Если вы сделаете уровень вложенности параметром, вы можете вызвать свой собственный метод, используя каталог как новый 'root point' и передавая nestingLevel + 1 'для уровня вложенности.
Good luck & Have весело!