17

这个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

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

4

4 回答 4

8

因为p1p3有不同的根源。

如果您使用 "/home/sally/bar" 而不是 "home/sally/bar" for 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");
于 2014-09-05T04:38:38.300 回答
2

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

  • /家/莎莉/酒吧

如果两条路径都包含根,则可以正常工作。“系统相关”可能意味着 Windows 上的这种情况:

  • C:\主页
  • D:\家\莎莉\酒吧

上面给出了以下异常:

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

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

于 2013-04-30T13:01:51.707 回答
2

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

要解决此问题,您可以使用toAbsolutePath().

例如:

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);
  }
}
于 2016-07-03T10:34:23.677 回答
1

这里的系统依赖是指我假设的特定操作系统实现。所以Linux 会以不同于Windows 的方式来处理,等等。如果没有根路径(即以/ 开头的路径),则假定两条路径是同级的,位于同一级别(即在/home/sally 中)。因此,当您尝试相对化时,如果它们不在同一级别上,则无法保证非根路径的存储位置,如果您考虑一下,这是有道理的。这有帮助吗?

于 2013-04-30T12:55:01.683 回答