Java Files.walkTree

169
01 февраля 2019, 19:20

Только начал изучать Java и дойдя о раздела Path и Files столкнулся со следующей проблемой.

Задача: Вывести в консоль все папки и подпапки каталога.

Решил не делать это через рекурсию, а освоить метод Files.walkFileTree. Казалось бы, все просто. Задать проверку isDirectory для attrs в FileVisitResult во время провода директории и дело с концом. Однако, по какой то причине, эта проверка не действует и в список ничего не добавляется. Метод просто "бурится" до конца директории, игнорируя подпапки, как таковые. Что то близко похожее к желаемому результату было получено при помощи метода postVisitDirectory, но там в список, помимо подкатологов, подавлялась папка самой директории, где происходит поиск, что не совсем корректно. Что я делаю не так?

public class Prime {
    public static void main(String[] args) throws IOException {
        for (String H : getFileTree("C:\\Users\\IdeaProjects\\untitled1\\JR")) {
            System.out.println(H);
        }}
        public static List<String> getFileTree(String root) throws IOException {
        List<String> a  = new ArrayList<>();
        Files.walkFileTree(Paths.get(root), new SimpleFileVisitor<Path>() {
        @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
               if(attrs.isDirectory())
              a.add(attrs.toString());
                return FileVisitResult.CONTINUE;
            }
        });
        return a;
    }
}
Answer 1

Для поиска директорий нужно переопределить соседний метод preVisitDirectory

public static List<String> getFileTree(String root) throws IOException {
    List<String> a = new ArrayList<>();
    Files.walkFileTree(Paths.get(root), new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            a.add(dir.toString());
            return super.preVisitDirectory(dir, attrs);
        }
    });
    return a;
}
Answer 2

Сделайте так:

    List<Path> list = null;
    try {
        Path path = Path.of(root);
        list = Files.walk(path).filter(p -> p != path && p.toFile().isDirectory()).collect(Collectors.toList());
    } catch (IOException e) {
        // TODO implement better exception handling
        e.printStackTrace();
    }
    System.out.println(list);
READ ALSO
Vk api. Получение видео со стены

Vk api. Получение видео со стены

Подскажите, можно ли имея только сервисный ключ получить видео из общедоступных записей на стене группы? делаю к примеру запрос https://vkcom/dev/wall

198
Поменять местами элементы массива

Поменять местами элементы массива

Как поменять элементы массива местами и вывести их в столбик? Пользователь сам вводит числа в массив, неопределенное количество Допустим...

181
модификаторы доступа в интерфейсах

модификаторы доступа в интерфейсах

Можно ли задавать методам интерфейса модификатор private или protected? Если да то зачем?

167
Перенос строки в регулярном выражении

Перенос строки в регулярном выражении

Здравствуй сообщество, вопрос прост почему данная функция отрабатывает не так как нужноВроде бы должно всё игнорировать так как я добавил...

190