在 Java 中使用 Path 类在两个路径之间创建路径

2022-09-03 02:26:58

这个oracle java教程中的这句话到底是什么意思:

如果只有一个路径包含根元素,则无法构造相对路径。如果两条路径都包含根元素,则构造相对路径的能力取决于系统。

对于“系统依赖性”,它们是否仅意味着如果元素包含根,则它仅在已编写的特定于平台的语法中起作用?我想这是他们唯一的意思。有没有其他阅读方式?

例如:

public class AnotherOnePathTheDust {
    public static void main (String []args)
    {
    Path p1 = Paths.get("home");
    Path p3 = Paths.get("home/sally/bar"); //with "/home/sally/bar" i would get an exception.
    // Result is sally/bar
    Path p1_to_p3 = p1.relativize(p3);
    // Result is ../..

    Path p3_to_p1 = p3.relativize(p1);
    System.out.println(p3_to_p1);   }
}

我通过使用“/home/sally/bar”而不是“home/sally/bar”(没有root)得到的例外是这个:

 java.lang.IllegalArgumentException: 'other' is different type of Path

为什么它不起作用?他们所说的与系统的冲突是什么?


答案 1

因为和有不同的根。p1p3

如果您使用 “/home/sally/bar” 而不是 “home/sally/bar” 来表示 ,则 将返回但为 null。p3p3.getRoot()/p1.getRoot()

阅读以下代码(来自 http://cr.openjdk.java.net/~alanb/6863864/webrev.00/src/windows/classes/sun/nio/fs/WindowsPath.java-.html Line374-375)后,您将知道为什么会出现此异常:

// can only relativize paths of the same type
if (this.type != other.type)
     throw new IllegalArgumentException("'other' is different type of Path");

答案 2

我对你的例子做了一些测试。实际上,您提到的异常仅在其中一个路径包含根而另一个不包含根时出现(就像句子所说的那样),例如:

  • /首页/莎莉/酒吧

如果两个路径都包含根,则工作正常。“系统依赖”是指在Windows上可能出现这种情况:

  • C:\首页
  • D:\home\sally\bar

以上给出了以下例外情况:

java.lang.IllegalArgumentException: 'other' has different root

在Unix上,你永远不会遇到这样的事情(包含根 - 绝对路径的两个路径都有例外)


推荐