電子書籍の厳選無料作品が豊富!

URI uri1 = URI("./a1/a2/a3");(もしくはURI("C:/a1/a2/a3"))

URI uri2 = URI("./b1/b2/b3");(もしくはURI("C:/b1/b2/b3"))
という2つのURIがあって、
uri1からuri2への相対パス
../../../b1/b2/b3
を求めたいのですが、
Javaの標準ライブラリか何かで、
このアルゴリズムはサポートされていないでしょうか。

ちなみに、目をつけてみた
uri1.relativize(uri2)
では、
./b1/b2/b3
の結果になってしまいます。

自前で作成したものにバグが見つかったので、
できれば広く使われているモジュールを使用したいのです。

A 回答 (1件)

例によって未解決。

中間報告のみ。

>Javaの標準ライブラリか何かで、
このアルゴリズムはサポートされていないでしょうか。

一応ドキュメントにはそれらしき箇所があるのだけれど,

http://java.sun.com/javase/6/docs/api/java/net/U …

>if the path of this URI is not a prefix of the path of the given URI, then the given URI is returned.

url2がurl1のディレクトリの子孫にあたる時

public class Q3641263A{
public static void main(String[] args){
try{
java.net.URI uri1 = new java.net.URI("./a1/a2/a3/");
java.net.URI uri2 = new java.net.URI("./a1/a2/a3/a5");
System.out.println(uri1.isOpaque());
System.out.println(uri2.isOpaque());

System.out.println(uri1.relativize(uri2));
}catch(java.net.URISyntaxException e){
System.out.println(e.getStackTrace());
}
}

は,希望通り(正常に、とか正しく、とか言わないw)
a5が返る

http://bugs.sun.com/view_bug.do?bug_id=6226081
も少し気になっている。

#このバグに投稿されているコード,少なくとも一方が絶対URIなので
isOpaqueでメソッドの引数のURIがそのまま返ったりしないのだろうか・・・
=====
余談つーかブログから
同じようなものをC#で書くと・・・
[C#]

namespace P20080101B
{
class P20080101B
{
public static void Main(string[] args)
{
System.Uri address1 = new System.Uri("http://a1/a2/a3/");
System.Uri address2 = new System.Uri("http://a1/b2/b3/");
System.Console.WriteLine("The difference is {0}", address1.MakeRelativeUri(address2));

}
}
}

結果:
The difference is ../../b2/b3/

namespace P20080101C
{
class P20080101C
{
public static void Main(string[] args)
{
System.Uri address1 = new System.Uri("http://a1/a2/a3/");
System.Uri address2 = new System.Uri("http://a1/a2/a3/b1/");
System.Console.WriteLine("The difference is {0}", address1.MakeRelativeUri(address2));

}
}
}

結果:
The difference is b1/

と,どちらでも可能だ。
ただし,コンストラクタにRelativeURIを指定できそうになく。

====================
回避策・他ライブラリは現在の所発見できていません。
===========
>自前で作成したものにバグが見つかったので、
後学のためソースの提出とバグの解説が読みたいな
    • good
    • 0
この回答へのお礼

うーん、Javadocの英語読んでみて、さっぱりわからなかったので、日本語のJavadoc読んでみたのですが、あまりわからず。。
英語の読解力の低さもさることながら、専門用語の語彙もかなり低いみたいです。。

himajin10万さんは調べるのうまいですねー。
日本語では検索ワードとか思いつくんですけど、英語だとなんて検索していいかわからなくて・・。

最近やっと英語の技術書1冊読んだ程度の英語力なので、とりあえずあてずっぽ読みはできても検索のための文つくるとか流し読みでリンク辿るといったことがまだできない状況で。

そのようなライブラリが他に用意されていないのは以外でした。
どこかにベンダーがあってもおかしくないと思っていただけに。

自作したものは、URIではなく、Fileを扱うものです。
ライブラリを探す時間が惜しいという理由から作成したものなので、機能はとりあえずのものしかありませんが・・。

バグは、ありませんでした。
結局、呼び出したソースのほうに問題があったみたいです。
自作モジュールだと、テストをきちんとしていないため、すぐにバグを疑ってしまいます・・。
そういう点からも、よくテストされたモジュールほしいですよね。。

ソース提出の件等も含めて、また遊びにいきます。

いつもありがとうございます!

お礼日時:2008/01/03 19:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!