Каков наилучший способ игнорировать ведущий sla sh при разрешении java .nio.files.Path - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь провести рефакторинг некоторого унаследованного кода, используя java.io.File для использования java.nio.file.Path.

Меня укусил тот факт, что Path лучше поддерживает абсолютные пути к файлам, потому что многие из у значений, которые я получаю, есть ведущий sla sh (/), в то время как они должны представлять относительные пути. Конкатенация строк в этом случае проще, но я пытаюсь отойти от String / File для представления путей к файлам.

Старое поведение заключалось в том, что new File(parent, child) возвращал новый File, представляющий

  • дочерний файл / каталог в родительском каталоге, независимо от того, начался ли child с /.

Новое поведение состояло в том, что parent.resolve(child) вернул новый Path, представляющий либо

  • дочерний файл / каталог в родительском каталоге
  • child как root (если он начинался с /)

I Я думаю, что новый способ может обеспечить более чистый код, но при рефакторинге унаследованного приложения он может содержать незначительные ошибки.

Какой самый лучший / самый чистый способ вернуть старое (File) поведение при используя Path?


import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

class Main {
  public static void main(String[] args) {
    file();
    path();
  }

  public static void file(){
    File root = new File("/root");
    File relative = new File(root, "relative");
    File absolute = new File(root, "/absolute");

    System.out.println("File:");
    System.out.println(relative.getAbsolutePath()); // prints "/root/relative"
    System.out.println(absolute.getAbsolutePath()); // prints "/root/absolute"
    System.out.println();
  }

  public static void path(){
    Path root = Paths.get("/root");
    Path relative = root.resolve("relative");
    Path absolute = root.resolve("/absolute");

    System.out.println("Path:");
    System.out.println(relative.toAbsolutePath()); // prints "/root/relative"
    System.out.println(absolute.toAbsolutePath()); // prints "/absolute" but should print "/root/absolute"
    System.out.println();
  }
}

По сути, мне нужен метод, который принимает родительский путь, и дочернюю строку, которая возвращает мне родительский + дочерний путь независимо от был ли у ребенка ведущий /.
сом как-то так, но без манипуляций со строками, которые зависят от того, что я знаю, что в конфигурации будет использоваться / (а не \):

private static Path resolveSafely(Path parent, String child) {
    child = child.startsWith("/")
            ? child.substring(1)
            : child;
    parent.resolve(child);
}

1 Ответ

1 голос
/ 06 марта 2020

Лучший способ найти это:

    Path root = Paths.get("/root");
    Path relative = root.resolve("relative");
    Path absolute = Paths.get(root.toString(), "/absolute");

    System.out.println("Path:");
    System.out.println(relative.toAbsolutePath()); // prints "/root/relative"
    System.out.println(absolute.toAbsolutePath()); // prints "/root/absolute"
    System.out.println();

Надеюсь, это все, что вам нужно.

...