Хотел реализовать алгоритм поиска файла, для нахождения всех совпадений:
Все совпадения будут выводиться в переменную find типа ArrayList. Ниже представлен сам алгоритм
spoilerpackage 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);
}
}