@hax
junior developer

В чем ошибка работы алгоритма поиска?

Хотел реализовать алгоритм поиска файла, для нахождения всех совпадений:
Все совпадения будут выводиться в переменную find типа ArrayList. Ниже представлен сам алгоритм
spoiler
package com.filefind;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Find {
    public static void main(String args[]) {
        long start = System.currentTimeMillis();
        try {

            ArrayList<File> find = new ArrayList<>(200);
            findFile("D:\\Autodesk", find, "README");
                find.forEach(System.out::println);
        }
        catch (NullPointerException error) {
            System.out.println("File not found!");
        }
        long end = System.currentTimeMillis();
        System.out.println("Поиск занял: " + (double) (end - start) / 1000 + " секунд");
    }

    public static void findFile(String path, List<File> result, String name) {
        if (!path.endsWith("\\"))
            path += "\\";
        File list[] = (new File(path)).listFiles();
        for (File file : list) {
            if (file.getName().contains(name))
                result.add(file);
            if (file.isDirectory())
                findFile(path + file.getName() + "\\", result, name);
        }
    }
}


На диске D:\ находится n файлов. Если вбивать конкретную папку на этом диске (т.е. D:\Folder1\), то поиск работает быстро и выдает верный результат. Если аргументу path передать значение D:\, то поиск выполняется 5-10 секунд и вылетает exception NullPointerException, однако при этом прогоняются все файлы и папки на диске D:\. Поиск через проводник Windows показал, что на диске хранятся 80 файлов, содержащих текст README. Почему после прогона в переменной find хранится null?

upd: Решил проблему. Код алгоритма поиска файлов:
spoiler
/** Функция поиска файлов в каталогах
     * @param path - путь, в котором следует выполнить поиск
     * @param result - в списке result будут храниться все совпадения
     * @param name - имя файла, которое следует найти
     */
    private static void findFile(String path, List<File> result, String name) {
        if (!path.endsWith("\\"))
            path += "\\";
        File list[] = (new File(path)).listFiles();
        if (list == null) return; // если listFiles() возвращает null, значит не удалось прочитать текущую папку (ограничение доступа в системе)
        for (File file : list) {
            if (file.getName().toLowerCase().contains(name.toLowerCase()))
                result.add(file);
            if (file.isDirectory())
                findFile(path + file.getName() + "\\", result, name);
        }
    }
  • Вопрос задан
  • 183 просмотра
Пригласить эксперта
Ответы на вопрос 2
Что в переменной list[] для D:\?

PS: Path separator в Java кроссплатформенный и вне зависимости от ОС следует использовать '/'
Также, чтобы не отслеживать эти слэши при склеивании имен файлов, лучше использовать конструктор File(File, String)
Ответ написан
@hax Автор вопроса
junior developer
Кажется, я нашёл причину ошибки. У меня на диске D:\ имеется одна скрытая папка, доступ к которой ограничивается системой. Именно поэтому при попытке чтения этой папки вылетает exception. Теперь вопрос в следующем: как программно мне отлавливать папки, доступ к которым ограничивается? Использовать try..catch или есть иной способ реализации?

upd: Решил проблему. Метод canExecute() почему-то не помог, однако заметил, что если метод listFiles() передаёт null, то чтение данной папки невозможно, поэтому просто выходим из метода.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы