Шаг 110.
Язык программирования Java.
Класс Files. Функция обхода дерева папок

На этом шаге мы рассмотрим функцию обхода дерева папок

Данная функция следующая:

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

Предыдущий шаг Содержание Следующий шаг