Java набор путей вывода в консоли - PullRequest
1 голос
/ 04 апреля 2020

Пожалуйста, посоветуйте хорошее решение в 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 

1 Ответ

3 голосов
/ 04 апреля 2020

Нет встроенного вызова 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 весело!

...