Извлечение относительных путей из абсолютных путей

Это, казалось бы, простая проблема, но у меня возникают проблемы с ее чистым способом. У меня есть путь к файлу следующим образом:

/это/это/абсолютный/путь/к/местоположению/моего/файла

Мне нужно извлечь /of/my/file из указанного выше пути, поскольку это мой относительный путь.

Я думаю сделать это следующим образом:

String absolutePath = "/this/is/an/absolute/path/to/the/location/of/my/file";
String[] tokenizedPaths = absolutePath.split("/");
int strLength = tokenizedPaths.length;
String myRelativePathStructure = (new StringBuffer()).append(tokenizedPaths[strLength-3]).append("/").append(tokenizedPaths[strLength-2]).append("/").append(tokenizedPaths[strLength-1]).toString();

Это, вероятно, удовлетворит мои насущные потребности, но может ли кто-нибудь предложить лучший способ извлечения подпутей из предоставленного пути в java?

Спасибо


person sc_ray    schedule 22.03.2012    source источник
comment
Вы должны либо знать, как выглядит корневой путь, либо как выглядит дочерний путь.   -  person Kiril    schedule 22.03.2012


Ответы (2)


Используйте класс URI:

URI base = URI.create("/this/is/an/absolute/path/to/the/location");
URI absolute =URI.create("/this/is/an/absolute/path/to/the/location/of/my/file");
URI relative = base.relativize(absolute);

Это приведет к of/my/file.

person McDowell    schedule 22.03.2012
comment
Спасибо. Мне было интересно, есть ли способ иметь больший контроль над тем, что нужно релятивизировать. Можно ли каким-то образом захватить /the/location/of/my/file таким же элегантным способом? - person sc_ray; 22.03.2012
comment
@sc_ray - да, измените свой базовый URI. - person jtahlborn; 22.03.2012
comment
@sc_ray Взгляните на File. >getParentFile. File содержит методы для преобразования в/из URI экземпляров. Пользователи Java 7 могут иметь возможность использовать тип Path в java.nio.file — я не рассматривал его подробно. - person McDowell; 23.03.2012

С чисто строковыми операциями и предполагая, что вы знаете базовый путь, и предполагая, что вам нужны только относительные пути ниже базового пути и никогда не добавляйте серию "../":

String basePath = "/this/is/an/absolute/path/to/the/location/";
String absolutePath = "/this/is/an/absolute/path/to/the/location/of/my/file";
if (absolutePath.startsWith(basePath)) {
    relativePath = absolutePath.substring(basePath.length());
}

Конечно, есть лучшие способы сделать это с классами, которые знают о логике пути, например File или URI. :)

person user1252434    schedule 22.03.2012