タグ別アーカイブ: URL

javaにおけるURLとURIの違い

javaにおいて似たような(これはわかってる人からしたらおしかりを受けそうな表現ではあるが)URLとURIについて、実は結構その違いについてうやむやにしたままやってきた部分があるので、この際ですしその違いについて調べてみます。

概要

javaにおけるURL(java.net.URL)と URI(java.net.URI)の違いとかについて述べます

調査

調べましょう。と言っても実はjavaDocsにかなり詳細が書いてありますのでそちらを参照していただけば早い話です。

URLおよびURIを確認しましょう。

かいつまんで解説すると

両者を比較しながら解説しましょう。
※下記の内容は javaの公式 に含まれる内容なのでより正確な情報を確認したい方は参照元を確認してください。

URI(Uniform Resource Identifier)はその名の示すとおり、リソースが指す場所を一意に示すための識別子です。

これには当然おなじみの http://example.com/hoge/fuga.html などのウェブ上のURLなんかを含みます。
幾つか例を上げてみましょう。

http://java.sun.com/j2se/1.3/
docs/guide/collections/designfaq.html#28
../../../demo/jfc/SwingSet2/src/SwingSet2.java
file:///~/calendar

でこれをちょっとした表現で示すと下記のようになっています。

[スキーム:]スキーム固有部分[#フラグメント]
ここで、角括弧 […] は省略可能なコンポーネントを表し、文字 : と # はその文字自体を表します。

さらにスキームが指定してあるものを 絶対URI と呼びます。また絶対でないURIは 相対URI と及びます。
さらにさらにスキーム固有部分がスラッシュで始まらないものを 不透明URI と呼びます。

不透明URIには例えば下記のようなものがあります

mailto:java-net@java.sun.com
news:comp.lang.java
urn:isbn:096139210x

とまあ、こういったようにリソースの識別子を文字列で表現したものがいわゆる URI となります。
不透明URIという表現が示すように、割りと固有の表現もありますが、そこら辺はあくまでそのドメインが解釈するものとして「これもURIですよ!」みたいな感じで(割りと)ゆるい定義をしています。

というわけで上記の定義に則っていればなんだってURIになります。
java実装面の話をしますとURIは単なるリソースを識別するための文字列なんで、それ以上それ以下でもありません。

URI の役割は、あるURIと他のURIが指しているものが一緒かどうか?とか、あるベースURIとある相対URIをくっつけて(これを解決するといいます)新しいURIを作成するとか、そういう責務がメインになります。

それに対して URL はもっと具体的なことを表現します。
Uniform Resource Locator という名前が指すように、何かしらのリソースが存在することを表現します。

またまたjava実装の話になりますが URL は URI で行っていた単純な文字列表現だけでなく、そのリソースにアクセスする手段などを合わせて提供します。
もっというとjavaのURLクラスに関しては ウェブスキーム(http)限定のリソースを表現する実装として機能しているようです。

やや抽象的な感じも残りますが、より詳細が知りたい方は合わせて

RFC2396RFC2732 を参照してみてください。