解决java.nio.files.Path时忽略斜杠的最佳方法是什么

时间:2020-03-06 14:15:35

标签: java nio filepath

我正在尝试使用java.io.File重构一些旧代码,以改为使用java.nio.file.Path

我对Path更好地支持绝对文件路径感到困扰,因为我收到的许多值在表示相对路径时都带有一个斜杠(/)。字符串连接更容易通过这种方式进行,但是我正尝试从String / File转向代表文件路径。

过去的行为是new File(parent, child)返回了一个新的File代表

  • 父目录下的子文件/目录,无论子目录是否以/开头。

新的行为是parent.resolve(child)返回了代表其中一个的新Path

  • 父目录下的子文件/目录
  • 以孩子为根(如果它以/开头)

我认为新方法可以使代码更简洁,但是在重构旧版应用程序时,它可能会引入一些细微的错误。

在使用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();
  }
}

基本上我想要的是一个方法,该方法采用一个父路径,一个子字符串返回一个父+子路径,而无论子是否有前导/
这样的事情,但是没有依赖我的String操作,知道该配置将使用/(而不是\):

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

1 个答案:

答案 0 :(得分:1)

我能找到的最好方法是:

Fragment

希望这就是您所需要的。