Почему новый объект Path Java 7 не может быть релятивизирован, когда только один путь включает в себя корневой элемент? - PullRequest
5 голосов
/ 30 августа 2011

Согласно java.nio.file.Path:

Относительный путь не может быть создан, если только один из путей имеет корневой компонент.

Почему это так?Почему невозможно релятивизировать так:

Path path1 = Paths.get("/home/test");
Path path2 = Paths.get("home");

// throws an IllegalArgumentException
Path path3 = path1.relativize(path2);

Я предполагал, что path3 приведет к относительному пути ../.Почему для Path допустимо возвращать результат, который предполагает, что два каталога находятся на одном уровне в файловой системе, если корневые элементы не определены, но когда только один путь определяет корневой элемент (как показано выше),Относительный путь можно определить?

т.е.

Path path1 = Paths.get("home/test");
Path path2 = Paths.get("user");

// results in ../../user
Path path3 = path1.relativize(path2);

1 Ответ

5 голосов
/ 30 августа 2011

Неабсолютный путь относительно некоторого неопределенного базового каталога. Если у вас есть два таких пути, будет иметь смысл представить, что они относятся к одному и тому же (но все еще не определено) базовому каталогу, и тогда имеет смысл спросить, где находится один по отношению к другому.

С другой стороны, если у вас есть два пути, из которых только один является абсолютным, например, /home/test и home, вы не знаете, каково это отношение. Например, если базовый каталог равен /home/test/blah, то home означает /home/test/blah/home, и поэтому он должен относиться к blah/home. Но как метод узнает, как изобрести blah (или изобрести что-то еще целиком)?

Весь смысл использования относительного пути состоит в том, чтобы сказать: Я пока не говорю , каким будет базовый каталог для этого пути. Ожидание от библиотеки времени выполнения предположения базового пути, о котором мы явно не говорим, будет полностью противоречить этой семантике.

...