Почему новый объект Path в Java 7 не может быть относительным, если только один Path включает корневой элемент?

Согласно 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 допустимо возвращать результат, предполагающий, что два каталога находятся на одном уровне в файловой системе, если не определены корневые элементы, однако, когда только один путь определяет корневой элемент (как показано выше), относительный путь отсутствует можно определить?

i.e.

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

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

person wulfgarpro    schedule 30.08.2011    source источник


Ответы (1)


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

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

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

person hmakholm left over Monica    schedule 30.08.2011
comment
почему имеет «какой-то смысл» представлять, что они относятся к одному и тому же базовому каталогу? Что, если это не так? - person wulfgarpro; 30.08.2011
comment
Возможно имеет смысл предполагать, что они в конечном итоге будут иметь один и тот же базовый каталог, даже если вы еще не знаете, что это такое. Вы можете не использовать эту функцию, когда знаете, что она не работает. С другой стороны, не имеет особого смысла предполагать, что неабсолютная строка в конечном итоге будет интерпретирована относительно корня. Если вы уже знаете, какой будет база, вместо этого используйте абсолютный путь. Из всех случаев, когда вы знаете, какой будет база, те, где она конкретно /, достаточно редки, чтобы не делать ее молчаливым предположением по умолчанию. - person hmakholm left over Monica; 30.08.2011