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

使用path类在Java中的两个路径之间创建路径,java,path,relative-path,Java,Path,Relative Path,oracle java教程中这句话的确切含义是什么: 如果只有一条路径,则无法构造相对路径 包括根元素。如果两个路径都包含根元素,则 构建相对路径的能力取决于系统 “system dipendent”是否意味着如果一个元素包含一个根元素,它将只在已编写的特定于平台的语法中工作? 我想这是他们唯一的意思。 还有其他的阅读方法吗 例如: public class AnotherOnePathTheDust { public static void main (String []args)

oracle java教程中这句话的确切含义是什么:

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

“system dipendent”是否意味着如果一个元素包含一个根元素,它将只在已编写的特定于平台的语法中工作? 我想这是他们唯一的意思。 还有其他的阅读方法吗

例如:

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”(不带根)得到的例外是:

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

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

这里的依赖系统指的是我假设的特定操作系统实现。因此,Linux将以不同于Windows等的方式处理此问题。如果没有根路径(即以/开头的路径),则假定两个路径都是兄弟路径,位于同一级别(即in/home/sally)。因此,当您尝试相对化时,如果它们不在同一级别上,则无法保证非根路径存储在何处,如果您仔细考虑,这是有意义的。这有用吗?

我对您的示例进行了一些测试。实际上,您提到的异常仅在其中一条路径包含root,而另一条路径不包含root时出现(与句子所说的完全相同),例如:

  • /家/莎莉/酒吧
如果两条路径都包含根,则其工作正常。“系统相关”可能指Windows上的这种情况:

  • C:\home
  • D:\home\sally\bar
以上给出了以下例外情况:

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

在Unix上,您永远不会遇到这样的情况(两个路径都包含根-绝对路径),因为
p1
p3
具有不同的根

如果对
p3
使用“/home/sally/bar”而不是“home/sally/bar”,则
p3.getRoot()
将返回
/
,但
p1.getRoot()
为空

阅读以下代码(来自第374-375行)后,您就会知道为什么会出现此异常:


正如其他答案已经提到的,这是由于路径中的根不同

要解决这个问题,可以使用
来解决路径()

例如:

public class AnotherOnePathTheDust {
  public static void main (String []args)
  {
    Path p1 = Paths.get("home").toAbsolutePath();
    Path p3 = Paths.get("/home/sally/bar").toAbsolutePath();

    Path p1_to_p3 = p1.relativize(p3);

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

为了记录在案,我在Ubuntu Linux中收到了这个问题。不过,我确实认为这与第一部分有关——其中一个是绝对的,另一个不是。@Brad Lee——你是说两个包含root的路径都有例外吗?我刚刚发现,如果一个路径包含“file:/home”和“other”/home”,我在Linux上尝试将这两个路径相对化时会出现相同的错误
public class AnotherOnePathTheDust {
  public static void main (String []args)
  {
    Path p1 = Paths.get("home").toAbsolutePath();
    Path p3 = Paths.get("/home/sally/bar").toAbsolutePath();

    Path p1_to_p3 = p1.relativize(p3);

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