Advertisement
swen922

Untitled

Aug 14th, 2018
330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1.  
  2. package com.javarush.task.task31.task3111;
  3. Продвинутый поиск файлов
  4.  
  5.  
  6. Тугая задача, но не по причине валидатора или замороченных условий, а из-за самого метода Files.walkFileTree – с непривычки сложно понять логику работы.
  7.  
  8. Попробую прописать ниже то, что самому было непонятно, может, пригодится кому, да и себе полезно повторить.
  9.  
  10. 1. Метод Files.walkFileTree, который вызывается в main, делает обход указанного ему в аргументе древа файлов. То есть нам не надо самим писать какую-то логику обхода, она уже есть внутри него.
  11.  
  12. 2. Для проверки соответствия файлов требуемым критериям в этот метод, вместе с путем скармливается второй аргумент – в нашем случае это экземпляр самописного класса SearchFileVisitor, который наследуется от SimpleFileVisitor.
  13. Именно поэтому мы пишем в нем @Override на метод FileVisitResult visitFile.
  14.  
  15. 3. И как раз самый мозговыносящий момент – это самый Override метод FileVisitResult visitFile.
  16. Даже после прочтения хорошей статьи на Хабре, на которую тут приводятся ссылки, все равно не совсем понятно, что он делает и что он возвращает.
  17. Так вот.
  18. Для наших целей удобнее считать его void методом.
  19. Enum, который прописан у него в сигнатуре как возвращаемый объект, – по-сути сигнал, как работать дальше. То ли продолжить работу, то ли прерваться и т.д.
  20. Но то, что мы хотим от него добиться, мы должны будем прописать в нем так, как обычно делаем в void-методах. Именно поэтому мы заранее создали поле со списком файлов в классе – это поле мы заполним с помощью этого "как-бы void" метода.
  21.  
  22. 4. И второй мозговыносящий момент: надо понять, что метод FileVisitResult visitFile работает только с ОДНИМ файлом (Path file, который у него идет первым аргументом).
  23. Этот файл ему передал "вышестоящий" метод Files.walkFileTree, который занимается обходом всех файлов и папок в древе.
  24. Поэтому надо просто сделать с одним файлов все, что нам требуется.
  25. И в конце метода просигнализировать, что делать дальше.
  26. И затем Files.walkFileTree снова вызовет наш метод, но уже с другим файлом в аргументе.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement