2013-04-30 100 views
9

什么不正是从this甲骨文的Java教程中的意思是这句话:使用Path类在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 /萨利/条”,而不是 “家庭/萨利/条”(无根)是这一个:

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

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

回答

1

这里所依赖的系统是指我假设的特定操作系统实现。因此,Linux将以不同于Windows的方式处理这种情况,等等。没有根路径(即以/开头的路径),两条路径被假定为同级(即在/ home/sally)中的兄弟姐妹。所以当你试图相对化时,如果它们不在同一层次上,那么就不能保证非根路径的存储位置,如果你仔细想想,这是有道理的。这有帮助吗?

1

我对你的例子做了一些测试。

  • /家庭/萨利/条

:其实你提的例外,当一个路径包含根和其他未(完全一样的句子说的)如只出现如果两个路径都包含根,它就可以工作。该 “制度依赖” 是指在Windows上可能这样的情况下:

  • C:\家里
  • d:\家\莎莉\吧

上面给出了以下情况除外:

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

在Unix上您将永远不会遇到类似的情况(包含根路径和绝对路径的两个路径例外)

+0

为了记录在案,我在Ubuntu Linux操作系统接收到这个问题。但我认为这与第一部分有关 - 在哪里是绝对的,哪一个不是。 – 2014-05-07 19:27:41

+0

@Brad Lee - 你的意思是你得到了包含root的两个路径的异常? – macias 2014-05-08 04:50:26

+0

我刚刚发现,如果一个路径包含“file:/ home”和其他“/ home”,我在尝试在Linux上相对化时遇到同样的错误 – Cristiano 2015-07-31 10:58:12

4

B因为p1p3有不同的根。

如果您使用的使用,而不是“家庭/萨利/条”为p3“/家/萨利/条”,然后p3.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"); 
1

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

要解决该问题,您可以使用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); 
    } 
}