2012-03-22 25 views
2

これは一見単純な問題ですが、私はそれをきれいに行うのに問題があります。次のように私は、ファイルパスを持っている:私は必要なもの絶対パスからの相対パスの抽出

/本/である/ /絶対/パス/ /場所/ /私/ファイル/のに

は私の/ファイル/の/を抽出することですそれは私の相対的な経路なので、上の与えられたパスから。

次のように私はそれをやってを考えています方法は次のとおりです。

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)メソッドを見てください。 'File'は' URI'インスタンスとの間で変換するためのメソッドを含みます。 Java 7ユーザーは、[java.nio.file](http://docs.oracle.com/javase/7/docs/api/java/nio/file/package-summary)で 'Path'タイプを使用できるようになります.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など)でこれを実行します。 :)

関連する問題