2012-03-22 8 views
2

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

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

Что мне нужно, чтобы извлечь/из/мой/файл от указанного выше пути, поскольку это мой относительный путь.

Так я имею в виду делать это следующим образом:

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?

Благодаря

+0

Вы должны либо знать, как выглядит корневой путь, или как выглядит «дочерний» путь. – Kiril

ответ

10

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

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.

+0

Спасибо. Мне было интересно, есть ли способ получить больше контроля над релятивизацией. Можно ли каким-либо образом захватить// location/of/my/file аналогичным образом? –

+0

@sc_ray - да, измените свой базовый URI. – jtahlborn

+0

@sc_ray Посмотрите на метод 'File' [getParentFile] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#getParentFile%28%29). 'Файл' содержит методы для преобразования в/из экземпляров URI. Пользователи Java 7 _might_ могут использовать тип 'Path' в [java.nio.file] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/package-summary .html) - я не смотрел на нее ни в какой глубине. – McDowell

1

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

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. :)

Смежные вопросы