#java #path #tree #directory #traversal
#java #путь #дерево #каталог #обход
Вопрос:
Для программы я пытаюсь создать дерево каталогов. Итак, первая часть моей программы использует пути для обхода нужного мне каталога:
public static void main(String[] args) throws IOException {
Path startingDir = Paths.get("/home/somedirectory");
PrintFiles pf = new PrintFiles();
Files.walkFileTree(startingDir, pf);
}
И программа PrintFiles (я напрямую скопировал это из руководства по использованию путей для обхода дерева) http://download.oracle.com/javase/tutorial/essential/io/walk.html:
public static class PrintFiles extends SimpleFileVisitor<Path> {
//Print information about each type of file.
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
if (attr.isSymbolicLink()) {
System.out.format("Symbolic link: %s ", file);
} else if (attr.isRegularFile()) {
System.out.format("Regular file: %s ", file);
} else {
System.out.format("Other: %s ", file);
}
System.out.println("(" attr.size() "bytes)");
return CONTINUE;
}
//Print each directory visited.
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
System.out.format("Directory: %s%n", dir);
return CONTINUE;
}
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.err.println(exc);
return CONTINUE;
}
}
У меня также есть общая древовидная программа, которая создает дерево с любым количеством узлов, с типичными функциями добавления узлов удаления узлов и т.д. (я не собираюсь публиковать код, потому что он длинный, и я не думаю, что это действительно необходимо, поскольку это довольно стандартная реализация).
Мой вопрос заключается в том, как именно мне сделать что-то, где я могу создать общее дерево, представляющее дерево каталогов для моего конкретного каталога? Я не совсем знаком с тем, как работают библиотеки путей и файлов.
Спасибо, Кевин
Комментарии:
1. Я бы подумал об использовании apache commons io fileutils для обхода каталога
Ответ №1:
Вам нужно будет реализовать preVisitDirectory, postVisitDirectory and visitFile
. И вам нужно будет сохранить «текущий узел» в вашей реализации visit.
- В pre создайте новый узел, добавьте его
currentNode
, а затем установитеcurrentNode = newNode
- В visitFile создайте новый конечный узел и добавьте его в
currentNode
- В post set
currentNode = currentNode.getParent()
Это что-то вроде операции со стеком, когда вы «нажимаете» preVisit
и «вставляете» postVisit
.
Комментарии:
1. Я понимаю, как работает этот алгоритм, но как именно мне контролировать, когда вызывать каждую из этих функций? Например, весь обход выполняется внутри функции walkFileTree, так нужно ли мне создавать собственную реализацию этого?
2. Вам просто нужно реализовать интерфейс FileVistor и передать эту реализацию функции walkFileTree. Он выполняет это перемещение и вызывает ваш класс visitor в соответствующих точках.