На этом шаге мы рассмотрим функцию обхода дерева папок
Данная функция следующая:
Path walkFileTree(Path start, FileVisitor<? super Path> visitor) throws IOException
Параметр start задает корневую папку обхода.
Параметр visitor имеет тип FileVisitor. Это интерфейс со следующими функциями:
Функции интерфейса из FileVisitor возвращают значение типа FileVisitResult. Это перечисление со следующими значениями:
Так как FileVisitor это интерфейс, то придется создать класс, который его реализует. А значит данный класс будет реализовывать все четыре метода. Но часто в поставленной задаче программисту не нужно реализовывать все функции. Для этой цели разработчики языка Java написали сами класс SimpleFileVisitor, который реализует все четыре функции. Программисту остается отнаследоваться от этого класса и переопределить только те функции которые ему необходимы вместо всех четырех функций интерфейса FileVisitor.
Приведем ниже пример программы, использующую рассмотренную выше функцию.
import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; public class Main { public static void main(String[] args) { Path root = Paths.get("tmpDir1"); if (Files.notExists(root)) { System.out.println("Папка " + root.toString() + " не существует"); return; } try { Files.walkFileTree(root, new FileVisitor<Path>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { System.out.println("Обход папки " + dir.toString() + " начался"); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { System.out.println("Посетили файл " + file.toString()); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { System.out.println("Ошибка при посещении файла " + file.toString()); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { System.out.println("Обход папки " + dir.toString() + " закончился"); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { System.out.println("При обходе дерева папок произошла ошибка"); } } }
Проект можно взять здесь
Рис. 1. Вывод программы
На следующем шаге мы приведем несколько примеров использования класса Files