What does exactly mean this sentence from this oracle java tutorial:
A relative path cannot be constructed if only one of the paths includes a root element. If both paths include a root element, the capability to construct a relative path is system dependent.
With "system dipendent" do they mean only that if an element contains a root it will work only in the platform specific syntax that has been written? I guess it is the only thing they mean. Are there any other ways of reading that?
for example :
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); }
}
The exception that I get by using "/home/sally/bar" instead of "home/sally/bar" (without root) is this one:
java.lang.IllegalArgumentException: 'other' is different type of Path
Why does it not work? what is the conflict with the system that they mean?
Because
p1
andp3
has different root.If you use use "/home/sally/bar" instead of "home/sally/bar" for
p3
, thenp3.getRoot()
will return/
butp1.getRoot()
is null.You'll know why you got this exception after you read following codes (comes from http://cr.openjdk.java.net/~alanb/6863864/webrev.00/src/windows/classes/sun/nio/fs/WindowsPath.java-.html Line374-375):
I did some tests of your example. Actually the exception you are mentioning appears only when one of the paths contains root and the other not (exactly like the sentence says) E.g:
It works ok if both paths contain roots. The "system dependent" means probably such case on Windows:
Above gives following exception:
You will never face something like this (exception for both paths containing root - absolute paths) on Unix
As other answers already mentioned this is due to the different roots in the path.
To work around that, you can use
toAbsolutePath()
.For example:
System dependent here refers to the specific OS implementation I would assume. So Linux will handle this differently than Windows will, etc. Without root paths (i.e. paths starting with /), both paths are assumed to be siblings, sitting on the same level (i.e. in /home/sally). So when you try to relativize, if they are not on the same level, there is no guarantee where the non-root path is stored, which makes sense if you think about it. Does that help?