Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.javarush.task.task31.task3111;
- Продвинутый поиск файлов
- Тугая задача, но не по причине валидатора или замороченных условий, а из-за самого метода Files.walkFileTree – с непривычки сложно понять логику работы.
- Попробую прописать ниже то, что самому было непонятно, может, пригодится кому, да и себе полезно повторить.
- 1. Метод Files.walkFileTree, который вызывается в main, делает обход указанного ему в аргументе древа файлов. То есть нам не надо самим писать какую-то логику обхода, она уже есть внутри него.
- 2. Для проверки соответствия файлов требуемым критериям в этот метод, вместе с путем скармливается второй аргумент – в нашем случае это экземпляр самописного класса SearchFileVisitor, который наследуется от SimpleFileVisitor.
- Именно поэтому мы пишем в нем @Override на метод FileVisitResult visitFile.
- 3. И как раз самый мозговыносящий момент – это самый Override метод FileVisitResult visitFile.
- Даже после прочтения хорошей статьи на Хабре, на которую тут приводятся ссылки, все равно не совсем понятно, что он делает и что он возвращает.
- Так вот.
- Для наших целей удобнее считать его void методом.
- Enum, который прописан у него в сигнатуре как возвращаемый объект, – по-сути сигнал, как работать дальше. То ли продолжить работу, то ли прерваться и т.д.
- Но то, что мы хотим от него добиться, мы должны будем прописать в нем так, как обычно делаем в void-методах. Именно поэтому мы заранее создали поле со списком файлов в классе – это поле мы заполним с помощью этого "как-бы void" метода.
- 4. И второй мозговыносящий момент: надо понять, что метод FileVisitResult visitFile работает только с ОДНИМ файлом (Path file, который у него идет первым аргументом).
- Этот файл ему передал "вышестоящий" метод Files.walkFileTree, который занимается обходом всех файлов и папок в древе.
- Поэтому надо просто сделать с одним файлов все, что нам требуется.
- И в конце метода просигнализировать, что делать дальше.
- И затем Files.walkFileTree снова вызовет наш метод, но уже с другим файлом в аргументе.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement