Как создать карту из корневого каталога в полный путь к файлу - PullRequest
1 голос
/ 16 марта 2019

Я пытаюсь создать метод, который сравнивает некоторый корневой путь и полный путь File и извлекает все каталоги с именами и полными путями к каждому каталогу в Map

Например, допустим, яхочу сделать Map, который будет выглядеть примерно так:

Map<String, File> mapFile = new HashMap<>;
mapFile.put("root", new File("/root"));
mapFile.put("dir1", new File("/root/dir1"));
mapFile.put("dir2", new File("/root/dir1/dir2"));
mapFile.put("dir3", new File("/root/dir1/dir2/dir3"));

Вот решение, которое я дошел до сих пор:

private Map<String, File> fileMap(String rootPath, File file) {
    Map<String, File> fileMap = new HashMap<>();
    String path = file.getPath().substring(rootPath.length()).replaceAll("\\\\", "/");// fu windows....
    String[] chunks = path.split("/");
    String p = rootPath.endsWith("/") ? rootPath.substring(0, rootPath.length() - 1) : rootPath;
    for (String chunk : chunks) {
        if (chunk.isEmpty()) continue;
        p += "/" + chunk;
        fileMap.put(chunk, new File(p));
    }
    return fileMap;
}

И вот как следует использовать:

Map<String, File> fileMap = fileMap("/root", new File("/root/dir1/dir2/dir3"));
fileMap.forEach((name, path) -> System.out.println(name + ", " + path));

Основная проблема в том, что мне это не нравится, и похоже, что оно сделано только для того, чтобы пройти тесты ... И это выглядит ужасно.

Существуют ли какие-либо встроенные решения или функции в Java, которые могут сделать это более понятным.При кодировании чего-то подобного я чувствую, что пытаюсь найти способ кипятить воду.Так что любая помощь будет оценена.Спасибо.

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Используйте Path класс для получения имени каталога:

private static Map<String, File> fileMap(String rootPath, File file) {
    Map<String, File> fileMap = new HashMap<>();
    fileMap.put(Paths.get(rootPath).getFileName().toString(), new File(rootPath));  // add root path
    Path path = file.toPath();

    while (!path.equals(Paths.get(rootPath))) {
        fileMap.put(path.getFileName().toString(), new File(path.toUri())); // add current dir
        path = path.getParent(); // go to parent dir
    }
    return fileMap;
}

Вы можете даже передать Path в качестве аргумента прямо как

fileMap("/root", new File("/root/dir1/dir2/dir3").toPath());

Вв этом случае вам вообще не нужен File в методе

0 голосов
/ 17 марта 2019

Вы можете просто использовать метод file.getParentFile() для поиска пути к файлу, пока не доберетесь до корневого каталога:

private static Map<String, File> fileMap(String rootPath, File file) {
    if (!file.getAbsolutePath().startsWith(rootPath)) {
        throw new IllegalArgumentException(file.getAbsolutePath() + " is not a child of " + rootPath);
    }
    File root = new File(rootPath);
    Map<String, File> fileMap = new HashMap<>();
    while (!root.equals(file)) {
        fileMap.put(file.getName(), file);
        file = file.getParentFile();
    }
    fileMap.put(root.getName(), root);
    return fileMap;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...