public final class URI extends Object implements Comparable<URI>, Serializable
後述するいくつかの小さな変更を除けば、このクラスのインスタンスは、「RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax」で定義され、「RFC 2732: Format for Literal IPv6 Addresses in URLs」で修正されたURI参照を表します。リテラルIPv6アドレス形式ではスコープIDもサポートされます。スコープIDの構文や使用方法については、ここを参照してください。このクラスは、コンポーネントからまたは文字列形式を解析してURIインスタンスを作成するためのコンストラクタ、インスタンスの各種コンポーネントにアクセスするためのメソッド、およびURIインスタンスを正規化、解決、相対化するためのメソッドを提供します。このクラスのインスタンスは不変です。
[スキームここで、角カッコ[...]はオプションのコンポーネントを表し、文字:
]スキーム固有部分[#
フラグメント]
:
と#
はその文字自体を表します。
絶対 URIはスキームを指定し、絶対でないURIは相対と呼ばれます。また、URIは不透明であるか階層的であるかによって分類されます。
不透明 URIは、スキーム固有部分がスラッシュ(「/」
)で始まらない絶対URIです。不透明URIはそれ以上解析されません。不透明URIの例を次に示します。
mailto:java-net@java.sun.com
news:comp.lang.java
urn:isbn:096139210x
階層 URIは、スキーム固有部分がスラッシュで始まる絶対URI、または相対URI (スキームを指定しないURI)です。階層URIの例を次に示します。
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のパス・コンポーネントは、スラッシュ(「/」
)で始まる場合は絶対と呼ばれ、そうでない場合は相対と呼ばれます。絶対である階層URIまたは機関を指定する階層URIのパス・コンポーネントは常に絶対です。
URIインスタンスには、全部で次の9つのコンポーネントがあります。
指定されたインスタンスでは、どの特定のコンポーネントも未定義か定義済みであり、個別の型の値を持ちます。未定義の文字列コンポーネントは
コンポーネント 型 スキーム String
スキーム固有部分 String
機関 String
ユーザー情報 String
ホスト String
ポート int
パス String
クエリー String
フラグメント String
null
で表され、未定義の整数コンポーネントは-1
で表されます。文字列コンポーネントは、値として空の文字列を持つよう定義できます。これは、そのコンポーネントが未定義であることと同等ではありません。
特定のコンポーネントがインスタンスで定義されるかされないかは、表現されるURIの型により異なります。絶対URIにはスキーム・コンポーネントがあります。不透明URIにはスキーム、スキーム固有部分、およびおそらくフラグメントがありますが、その他のコンポーネントはありません。階層URIには、常にパス(ただし空の場合あり)およびスキーム固有部分(少なくともパスを含む)があり、さらにその他のコンポーネントのいずれかがある場合があります。機関コンポーネントが存在していてサーバー・ベースである場合、ホスト・コンポーネントは定義されます。ユーザー情報とポート・コンポーネントは定義される場合もあります。
正規化は、階層URIのパス・コンポーネントから不要な「.」
および「..」
セグメントを削除するプロセスです。各「.」
セグメントは単に削除されます。「..」
セグメントは、「..」
以外のセグメントが先行する場合にだけ削除されます。正規化は不透明URIには影響しません。
解決とは、あるURIを別のベース URIに基づいて解決する処理のことです。結果として得られるURIは、RFC 2396に規定された方法に基づいて、両方のURIのコンポーネントから構築されます。具体的には、元のURIで指定されていないコンポーネントについては、ベースURIから取得されます。階層URIの場合、元のパスは、ベースのパスに基づいて解決されたあと、正規化されます。たとえば、次のようになります。
docs/guide/collections/designfaq.html#28
(1)
をベースURI http://java.sun.com/j2se/1.3/
に対して解決すると、結果のURIは次のようになります。
http://docs.oracle.com/javase/1.3/docs/guide/collections/designfaq.html#28
相対URI
../../../demo/jfc/SwingSet2/src/SwingSet2.java
(2)
をこの結果に対して解決すると、次のようになります。
http://java.sun.com/j2se/1.3/demo/jfc/SwingSet2/src/SwingSet2.java
絶対と相対の両方のURIの解決、および階層URIの場合は絶対と相対の両方のパスの解決がサポートされます。URI file:///~calendar
は絶対なので、これをほかの任意のURIに対して解決すると、元のURIが生成されるだけです。上記の相対URI (2)を相対ベースURI (1)に対して解決すると、正規化されていても相対のままのURIが生成されます。
demo/jfc/SwingSet2/src/SwingSet2.java
最後に相対化とは、解決の逆です。任意の2つの正規化済みURI uと vについて、次が成り立ちます。
uこの操作は、可能であればどこででも、ドキュメントのベースURIに対して相対的でなければならないURIを含むドキュメントを構築する場合に便利です。たとえば、次のURI.relativize(
u.resolve(
v)).equals(
v)
および
u.resolve(
u.relativize(
v)).equals(
v)
。
http://docs.oracle.com/javase/1.3/docs/guide/index.html
を次のベースURIに対して相対化すると、
http://java.sun.com/j2se/1.3
相対URI docs/guide/index.html
が生成されます。
英字 A
からZ
、およびa
からz
までのUS-ASCII英文字数字 0
から9
までのUS-ASCII 10進数字英数字 すべての英字および数字の文字 未予約 すべての英数字文字、および文字列 「_-!.~'()*」
内の文字句読 文字列 「,;:$&+=」
内の文字予約済み すべての句読文字、および文字列 「?/[]@」
内の文字エスケープ エスケープされたオクテット。つまり、パーセント文字( 「%」
)とそれに続く2桁の16進数(0
-9
、A
-F
、およびa
-f
)で構成される三重項その他 US-ASCII文字セットに含まれておらず、制御文字( Character.isISOControl
メソッドを使って判定)でなく、空白文字(Character.isSpaceChar
メソッドを使って判定)でないUnicode文字 (US-ASCIIに限定されているRFC 2396を変更したもの)
すべての有効なURI文字のセットは未予約、予約済み、エスケープ、およびその他の文字で構成されます。
URIにその他の文字を1つも含めないようにすることでURIをRFC 2396に厳密に準拠させる必要がある場合に、非US-ASCII文字をエンコードする。
そのままでは不正になるコンポーネント内の文字を引用符で囲む。ユーザー情報、パス、クエリー、およびフラグメントの各コンポーネントは、有効または不正と見なされる文字の条件が多少異なる。
文字はUTF-8文字セット内のその文字を表すエスケープされたオクテットのシーケンスで置き換えてエンコードされる。たとえば、ユーロ通貨記号(「u20AC」
)は「%E2%82%AC」
としてエンコードされる。(特定の文字セットを指定しないRFC 2396を変更したもの。)
すべての不正な文字は、単にエンコーディングして引用符で囲まれる。たとえば空白文字は、%20
で置き換えて引用符で囲まれる。UTF-8にはUS-ASCIIが含まれるので、US-ASCII文字の場合、この変換でRFC 2396で要求される効果が正確に得られる。
エスケープされたオクテットのシーケンスをデコードする。具体的には、そのシーケンスがUTF-8文字セット内で表している文字シーケンスで置換する。UTF-8はUS-ASCIIを含む。したがって、デコード処理は、引用符で囲まれたすべてのUS-ASCII文字の引用符を解除する効果と、エンコードされたすべての非US-ASCII文字をデコードする効果がある。エスケープされたオクテットのデコード時にデコード・エラーが発生した場合、そのエラーの発生したオクテットは、Unicode置換文字である\uFFFD
に置き換えられる。
単一引数コンストラクタは、その引数内のすべての不正文字が引用符で囲まれることを要求するが、存在するエスケープされたオクテットとその他の文字はすべてそのまま維持する。
複数引数コンストラクタは、不正文字を含むコンポーネントからの要求に従って不正文字を引用符で囲む。パーセント文字(%
)は常に、これらのコンストラクタによって囲まれる。その他の文字はすべてそのまま維持される。
getRawUserInfo
、getRawPath
、getRawQuery
、getRawFragment
、getRawAuthority
、およびgetRawSchemeSpecificPart
メソッドは、対応するコンポーネントの値をそのままの形式で返し、エスケープされたオクテットを解釈しない。これらのメソッドから返される文字列には、エスケープされたオクテットとその他の文字の両方が含まれていることがあり、不正な文字は含まれない。
getUserInfo
、getPath
、getQuery
、getFragment
、getAuthority
、およびgetSchemeSpecificPart
メソッドは、対応するコンポーネント内のすべてのエスケープされたオクテットをデコードする。これらのメソッドから返される文字列には、その他の文字と不正文字のどちらも含まれる可能性があるが、エスケープされたオクテットが含まれることはない。
toString
メソッドは、すべての必要な引用符を持つURI文字列を返すが、その他の文字が含まれる場合がある。
toASCIIString
メソッドは、完全に引用符で囲まれてエンコードされたURI文字列を返す。この文字列にはその他の文字は含まれない。
空の機関の前に2つのスラッシュがあったり(file:///tmp/ など)、ホスト名のあとにコロンがあってもポートが指定されていなかったり(new URI(
u.toString()).equals(
u)
。
http://java.sun.com:
など)するような冗長構文を含まず、引用符で囲む必要のある文字以外の文字をエンコードしないURI u
の場合は、次のようになります。
new URI(u.getScheme(), u.getSchemeSpecificPart(), u.getFragment()) .equals(u)すべての場合において
new URI(u.getScheme(), u.getUserInfo(), u.getAuthority(), u.getPath(), u.getQuery(), u.getFragment()) .equals(u)uが階層の場合
new URI(u.getScheme(), u.getUserInfo(), u.getHost(), u.getPort(), u.getPath(), u.getQuery(), u.getFragment()) .equals(u)uが階層で、機関を持たないかサーバー・ベースの機関を持つ場合。
mailto
、news
およびisbn
の各URIは、URNの例です。
URIとURLとの概念上の区別は、このクラスとURL
クラスの間の相違に反映されています。
このクラスのインスタンスは、RFC 2396で定義されている構文としてのURI参照を表します。URIは絶対、相対のいずれかになります。URI文字列は、スキームが指定されていてもそれについては考慮せず、ジェネリックな構文に従って解析されます。ホストが存在していてもその検索は実行されず、スキームに依存するストリーム・ハンドラの構築も行われません。等価性、ハッシュ処理、および比較は、インスタンスの文字内容に基づいて厳密に定義されます。言い換えれば、URIインスタンスは基本的に、比較、正規化、解決、および相対化という、スキームに依存しない構文上の操作をサポートする、構造化された文字列です。
これに対し、URL
クラスのインスタンスは、URLの構文上のコンポーネントを表すだけでなく、その記述対象となるリソースへのアクセスに必要な情報も一部備えています。URLは絶対でなければいけません。つまり、常にスキームを指定しなければいけません。URL文字列は、そのスキームに従って解析されます。どのURLに対してもストリーム・ハンドラが必ず確立されます。実際、使用可能なハンドラが存在しないスキームのURLインスタンスを作成することは不可能です。等価性とハッシュ処理は、スキームと、ホストのインターネット・アドレス(存在する場合)の両方に依存します。比較は定義されません。言い換えれば、URLは、解決という構文上の操作と、ホストの検索や指定されたリソースへの接続のオープンなどのネットワーク入出力操作をサポートする、構造化された文字列です。
コンストラクタと説明 |
---|
URI(String str)
指定された文字列を解析してURIを構築します。
|
URI(String scheme, String ssp, String fragment)
指定されたコンポーネントからURIを構築します。
|
URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment)
指定されたコンポーネントから階層URIを構築します。
|
URI(String scheme, String host, String path, String fragment)
指定されたコンポーネントから階層URIを構築します。
|
URI(String scheme, String authority, String path, String query, String fragment)
指定されたコンポーネントから階層URIを構築します。
|
修飾子と型 | メソッドと説明 |
---|---|
int |
compareTo(URI that)
このURIを別のオブジェクトと比較します。そのオブジェクトはURIである必要があります。
|
static URI |
create(String str)
指定された文字列を解析してURIを作成します。
|
boolean |
equals(Object ob)
このURIが別のオブジェクトと等しいかどうかを判定します。
|
String |
getAuthority()
このURIのデコードされた機関コンポーネントを返します。
|
String |
getFragment()
このURIのデコードされたフラグメント・コンポーネントを返します。
|
String |
getHost()
このURIのホスト・コンポーネントを返します。
|
String |
getPath()
このURIのデコードされたパス・コンポーネントを返します。
|
int |
getPort()
このURIのポート番号を返します。
|
String |
getQuery()
このURIのデコードされたクエリー・コンポーネントを返します。
|
String |
getRawAuthority()
このURIのそのままの機関コンポーネントを返します。
|
String |
getRawFragment()
このURIのそのままのフラグメント・コンポーネントを返します。
|
String |
getRawPath()
このURIのそのままのパス・コンポーネントを返します。
|
String |
getRawQuery()
このURIのそのままのクエリー・コンポーネントを返します。
|
String |
getRawSchemeSpecificPart()
このURIのそのままのスキーム固有部分を返します。
|
String |
getRawUserInfo()
このURIのそのままのユーザー情報コンポーネントを返します。
|
String |
getScheme()
このURIのスキーム・コンポーネントを返します。
|
String |
getSchemeSpecificPart()
このURIのデコードされたスキーム固有部分を返します。
|
String |
getUserInfo()
このURIのデコードされたユーザー情報コンポーネントを返します。
|
int |
hashCode()
このURIのハッシュ・コード値を返します。
|
boolean |
isAbsolute()
このURIが絶対かどうかを通知します。
|
boolean |
isOpaque()
このURIが不透明かどうかを通知します。
|
URI |
normalize()
このURIのパスを正規化します。
|
URI |
parseServerAuthority()
このURIの機関コンポーネント(定義されている場合)からユーザー情報、ホスト、およびポートの各コンポーネントへの解析を試みます。
|
URI |
relativize(URI uri)
指定されたURIをこのURIに対して相対化します。
|
URI |
resolve(String str)
指定された文字列を解析し、その後その文字列をこのURIに対して解決して、新しいURIを構築します。
|
URI |
resolve(URI uri)
指定されたURIをこのURIに対して解決します。
|
String |
toASCIIString()
このURIのコンテンツをUS-ASCII文字列として返します。
|
String |
toString()
このURIのコンテンツを文字列として返します。
|
URL |
toURL()
このURIからURLを構築します。
|
public URI(String str) throws URISyntaxException
このコンストラクタは、指定された文字列を解析する際に、RFC 2396の付録 Aの文法に厳密に従います。ただし、次の点に関しては、文法に従いません。
空の機関コンポーネントは、その後に空でないパス、クエリー・コンポーネント、フラグメント・コンポーネントが続いている場合にかぎり、許可される。これにより、「file:///foo/bar」
などのURIを解析できるようになる。これは、文法では許可されていないが、RFC 2396の意図するところと思われる。機関コンポーネントが空の場合、ユーザー情報、ホスト、ポートの各コンポーネントは未定義となる。
空の相対パスは許可される。これは、文法では許可されていないが、RFC 2396の意図するところと思われる。この逸脱の主な結果として、「#foo」
のような単独のフラグメントが、空のパスと指定されたフラグメントを持つ相対URIとして解析されるようになる。このURIはベースURIに基づいて解決できるので便利である。
ホスト・コンポーネント内のIPv4アドレスは、RFC 2732に従って厳密に解析される。ドットで4つに区切られたアドレスの各要素には、3桁を超える10進を含めることはできない。さらに、各要素の値は255を超えてはならないという制約がある。
ホスト・コンポーネント内のホスト名が単一のドメイン・ラベルだけで構成される場合、そのホスト名は英数字文字で始まってもかまわない。これは、文法では許可されていないが、RFC 2396のセクション 3.2.2の意図するところと思われる。この変更の結果として、s://123
のような階層URIの機関コンポーネントが、サーバー・ベース機関として解析されるようになる。
ホスト・コンポーネントでIPv6アドレスの使用が許可される。RFC 2732に従って、IPv6アドレスは角カッコ(「[」
と「]」
)で囲まなければいけない。IPv6アドレス自体は、RFC 2373に従って解析されなければいけない。IPv6アドレスはさらに、16バイトを超えないアドレス情報を記述するよう制約される。この制約は、RFC 2373で暗黙的に示されているが、文法では表現できない。
その他のカテゴリに含まれる文字は、RFC 2396がエスケープされたオクテットの使用を許可している場所であればどこでも使用できる。つまり、ユーザー情報、パス、クエリー、フラグメントの各コンポーネント内で使用できる。さらに、機関がレジストリ・ベースであれば、機関コンポーネント内でも使用できる。これにより、US-ASCII文字セットに含まれる文字以外のUnicode文字を、URIに含めることができるようになる。
str
- URIに解析される文字列NullPointerException
- str
がnull
の場合URISyntaxException
−上記の変更によって拡張されたRFC 2396に、指定された文字列が違反する場合public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException
スキームが指定され、パスも指定された場合、そのパスは空であるか、スラッシュ文字(「/」
)で始まっていなければいけません。そうでない場合、新しいURIのコンポーネントは、対応するパラメータにnull
を渡すか、port
パラメータの場合は-1
を渡して、未定義のままになることがあります。
このコンストラクタはまず、次のように指定されたコンポーネントからURI文字列を構築しますが、その際、RFC 2396のセクション 5.2のステップ 7に記載されているルールに従います。
最初、結果文字列は空になっている。
スキームが指定されている場合、そのスキームが結果の末尾に追加され、そのあとにコロン文字(「:」
)が追加される。
ユーザー情報、ホスト、またはポートが指定されている場合、文字列「//」
が末尾に追加される。
ユーザー情報が指定されている場合、そのユーザー情報が末尾に追加され、その後に単価記号(「@」
)が追加される。未予約、句読、エスケープ、その他のどのカテゴリにも含まれない文字はすべて、引用符で囲まれる。
ホストが指定されている場合、そのホストが末尾に追加される。ホストがリテラルIPv6アドレスであるが、角カッコ(「[」
と「]」
)で囲まれていない場合は、角カッコが追加される。
ポート番号が指定されている場合、コロン文字(「:」
)が末尾に追加され、その後にその10進数のポート番号が追加される。
パスが指定されている場合、そのパスが末尾に追加される。未予約、句読、エスケープ、その他のどのカテゴリにも含まれず、スラッシュ文字(「/」
)、単価記号(「@」
)のどちらとも等しくない文字はすべて、引用符で囲まれる。
クエリーが指定されている場合、疑問符文字(「?」
)が末尾に追加され、そのあとにそのクエリーが追加される。適正なURI文字でない文字はすべて、引用符で囲まれる。
最後に、フラグメントが指定されている場合、ハッシュ文字(「#」
)が末尾に追加され、そのあとにそのフラグメントが追加される。適正なURI文字でない文字はすべて、引用符で囲まれる。
結果として得られるURI文字列が解析されますが、この解析は、URI(String)
コンストラクタを呼び出したあと、その結果に対してparseServerAuthority()
メソッドを呼び出したかのように行われます。これにより、URISyntaxException
がスローされる可能性があります。
scheme
- スキーム名userInfo
−ユーザー名と認証情報host
- ホスト名port
−ポート番号path
- パスquery
- クエリーfragment
- フラグメントURISyntaxException
- スキームとパスの両方が指定されているがパスが相対の場合、指定されたコンポーネントから構築されたURI文字列がRFC 2396に違反する場合、または文字列の機関コンポーネントが存在するがサーバー・ベースの機関として解析できない場合public URI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException
スキームが指定され、パスも指定された場合、そのパスは空であるか、スラッシュ文字(「/」
)で始まっていなければいけません。そうでない場合、新しいURIのコンポーネントは、対応するパラメータにnull
を渡して、未定義のままになることがあります。
このコンストラクタはまず、次のように指定されたコンポーネントからURI文字列を構築しますが、その際、RFC 2396のセクション 5.2のステップ 7に記載されているルールに従います。
最初、結果文字列は空になっている。
スキームが指定されている場合、そのスキームが結果の末尾に追加され、そのあとにコロン文字(「:」
)が追加される。
機関が指定されている場合、文字列「//」
が末尾に追加され、その後にその機関が追加される。機関にリテラルIPv6アドレスが含まれる場合、そのアドレスを角カッコ(「[」
と「]」
)で囲む必要がある。未予約、句読、エスケープ、その他のどのカテゴリにも含まれず、単価記号(「@」
)と等しくない文字はすべて、引用符で囲まれる。
パスが指定されている場合、そのパスが末尾に追加される。未予約、句読、エスケープ、その他のどのカテゴリにも含まれず、スラッシュ文字(「/」
)、単価記号(「@」
)のどちらとも等しくない文字はすべて、引用符で囲まれる。
クエリーが指定されている場合、疑問符文字(「?」
)が末尾に追加され、そのあとにそのクエリーが追加される。適正なURI文字でない文字はすべて、引用符で囲まれる。
最後に、フラグメントが指定されている場合、ハッシュ文字(「#」
)が末尾に追加され、そのあとにそのフラグメントが追加される。適正なURI文字でない文字はすべて、引用符で囲まれる。
結果として得られるURI文字列が解析されますが、この解析は、URI(String)
コンストラクタを呼び出したあと、その結果に対してparseServerAuthority()
メソッドを呼び出したかのように行われます。これにより、URISyntaxException
がスローされる可能性があります。
scheme
- スキーム名authority
−機関path
- パスquery
- クエリーfragment
- フラグメントURISyntaxException
- スキームとパスの両方が指定されているがパスが相対の場合、指定されたコンポーネントから構築されたURI文字列がRFC 2396に違反する場合、または文字列の機関コンポーネントが存在するがサーバー・ベースの機関として解析できない場合public URI(String scheme, String host, String path, String fragment) throws URISyntaxException
コンポーネントは、null
を渡して未定義のままになることがあります。
この簡易コンストラクタは、次のように7つの引数のコンストラクタを呼び出すかのように動作します。
new
URI
(scheme, null, host, -1, path, null, fragment);
scheme
- スキーム名host
- ホスト名path
- パスfragment
- フラグメントURISyntaxException
- 指定されたコンポーネントから構築されたURI文字列がRFC 2396に違反する場合public URI(String scheme, String ssp, String fragment) throws URISyntaxException
コンポーネントは、null
を渡して未定義のままになることがあります。
このコンストラクタはまず、次のように指定されたコンポーネントを使って文字列形式のURIを構築します。
最初、結果文字列は空になっている。
スキームが指定されている場合、そのスキームが結果の末尾に追加され、そのあとにコロン文字(「:」
)が追加される。
スキーム固有部分が指定されている場合、そのスキーム固有部分が末尾に追加される。適正なURI文字でない文字はすべて、引用符で囲まれる。
最後に、フラグメントが指定されている場合、ハッシュ文字(「#」
)が文字列の末尾に追加され、その後にそのフラグメントが追加される。適正なURI文字でない文字はすべて、引用符で囲まれる。
新しいURIインスタンスを作成するために結果として得られるURI文字列が解析されますが、この解析は、URI(String)
コンストラクタを呼び出したかのように行われます。これにより、URISyntaxException
がスローされる可能性があります。
scheme
- スキーム名ssp
−スキーム固有部分fragment
- フラグメントURISyntaxException
- 指定されたコンポーネントから構築されたURI文字列がRFC 2396に違反する場合public static URI create(String str)
この簡易ファクトリ・メソッドは、URI(String)
コンストラクタを呼び出したかのように動作します。このコンストラクタからスローされたURISyntaxException
はすべて、キャッチされて新しいIllegalArgumentException
オブジェクト内にラップされたあと、スローされます。
このメソッドは、プログラム内で宣言されたURI定数のように、与えられた文字列が適正なURIであることがあらかじめわかっているために、文字列がそのように解析されない場合はプログラミング・エラーと見なされるような状況で使用するために提供されています。ユーザー入力や、エラーが含まれる可能性の高いその他の何らかのソースに基づいてURIが構築されるような状況では、URISyntaxException
を直接スローするコンストラクタを使用するようにしてください。
str
- URIに解析される文字列NullPointerException
- str
がnull
の場合IllegalArgumentException
- 指定された文字列がRFC 2396に違反する場合public URI parseServerAuthority() throws URISyntaxException
このURIの機関コンポーネントがすでにサーバー・ベースとして認識されている場合には、それはすでに解析されてユーザー情報、ホスト、ポートの各コンポーネントに分離されています。この場合、またはこのURIが機関コンポーネントを持たない場合には、このメソッドはこのURIをそのまま返します。
そうでない場合、このメソッドは機関コンポーネントからユーザー情報、ホスト、およびポートの各コンポーネントへの解析をもう一度試み、機関コンポーネントがそのように解析できなかった理由を説明する例外をスローします。
このメソッドが提供されているのは、RFC 2396に指定されているジェネリックURI構文が、不正なサーバー・ベース機関と適正なレジストリ・ベース機関とを常に区別できるとはかぎらないからです。このため、それは、前者のケースの一部を後者のケースとして扱わなければいけません。たとえば、URI文字列「//foo:bar」
内の機関コンポーネントは、適正なサーバー・ベース機関ではありませんが、レジストリ・ベース機関としては適正です。
URN、URLのどちらかであることがわかっているURIを操作する場合のような、多くの一般的な状況では、使用される階層URIは常にサーバー・ベースになります。したがって、それらはそのように解析されるか、エラーとして処理されるかのどちらかでなければいけません。これらの場合、
URI
u= new URI(str).parseServerAuthority();
上のような文を使えば、uが参照するURIに機関コンポーネントが含まれる場合に、その機関が常に適切なユーザー情報、ホスト、ポートの各コンポーネントを含むサーバー・ベース機関であることを保証できます。また、このメソッドを呼び出せば、機関をそのように解析できなかった場合にも、スローされた例外に基づいて適切な診断メッセージを確実に発行できます。
URISyntaxException
−このURIの機関コンポーネントが指定されているが、RFC 2396に従ってサーバー・ベース機関として解析できない場合public URI normalize()
このURIが不透明である場合、またはそのパスがすでに正規化された形式になっている場合は、このURIが返されます。そうでない場合は、このURIと同じ新しいURIが構築されます。ただしそのパスが、RFC 2396のセクション5.2、ステップ6、サブステップcからfに準拠した方法でこのURIのパスを正規化して求められる場合を除きます。次のようになります。
すべての「.」
セグメントが削除される。
「..」
セグメントの直前に「..」
以外のセグメントが存在する場合、その両方のセグメントが削除される。この手順が該当しなくなるまで繰り返される。
パスが相対であり、その最初のセグメントにコロン文字(「:」
)が含まれている場合、その前に「.」
セグメントが追加される。これにより、「a:b/c/d」
のようなパスを含む相対URIが、スキーム「a」
とスキーム固有部分「b/c/d」
を持つ不透明URIとして、あとで再度解析されてしまうのを防ぐことができる。(RFC 2396からの変更)
正規化されたパスは、削除を可能にする「..」
でない先行のセグメントが不十分だった場合、1つ以上の「..」
セグメントで始まります。正規化されたパスが「.」
セグメントで始まるのは、上記の手順3でそのようなセグメントが挿入された場合です。それ以外の場合は、正規化されたパスに「.」
セグメントや「..」
セグメントが含まれることはありません。
public URI resolve(URI uri)
指定されたURIがすでに絶対である場合、またはこのURIが不透明である場合は、指定されたURIが返されます。
指定されたURIのフラグメント・コンポーネントが定義済みであり、パス・コンポーネントが空であり、スキーム、機関、クエリーの各コンポーネントが未定義である場合、指定されたフラグメントを持つが、それ以外のすべてのコンポーネントはこのURIの値に等しいようなURIが返されます。これにより、「#foo」
のような単独のフラグメント参照を表すURIをベースURIに基づいて解析できるようになるので便利です。
そうでない場合、このメソッドは、RFC 2396のセクション 5.2に適合する方法で新しい階層URIを構築します。次のようになります。
このURIのスキームと指定されたURIのクエリーおよびフラグメント・コンポーネントを使用して、新しいURIが構築される。
指定されたURIに機関コンポーネントがある場合、新しいURIの機関とパスは指定されたURIから取られる。
そうでない場合、新しいURIの機関コンポーネントがこのURIからコピーされ、そのパスは次のようにして求められる。
指定されたURIのパスが絶対の場合、新しいURIのパスは指定されたURIから取られる。
それ以外の場合、指定されたURIのパスは相対なので、このURIのパスに基づいて指定されたURIのパスを解決することで、新しいURIのパスが計算される。これを行うには、このURIのパス(存在する場合)の最後のセグメント以外のすべてのセグメントを指定されたURIのパスに連結したあと、その結果をnormalize
メソッドを呼び出したかのように正規化する。
このメソッドの結果は、このURIが絶対の場合、または指定されたURIが絶対の場合にだけ、絶対になります。
uri
−このURIに対して解決されるURINullPointerException
- uri
がnull
の場合public URI resolve(String str)
この簡易メソッドは、このメソッドの呼出しが式resolve
(URI.
create
(str))
の評価と同じであるかのように動作します。
str
- URIに解析される文字列NullPointerException
- str
がnull
の場合IllegalArgumentException
- 指定された文字列がRFC 2396に違反する場合public URI relativize(URI uri)
指定されたURIのこのURIに対する相対化は、次のようにして求められます。
このURIまたは指定されたURIが不透明である場合、2つのURIのスキームと機関コンポーネントが同じでない場合、またはこのURIのパスが指定されたURIのパスの接頭辞でない場合は、指定されたURIが返される。
そうでない場合、指定されたURIから取られたクエリーおよびフラグメント・コンポーネントと、指定されたURIのパスの先頭からこのURIのパスを削除して求めたパス・コンポーネントを使用して、新しい相対階層URIが構築される。
uri
−このURIに対して相対化されるURINullPointerException
- uri
がnull
の場合public URL toURL() throws MalformedURLException
この簡易メソッドは、最初にこのURIが絶対であることを確認してから、このメソッドの呼出しが式new URL(this.toString())
の評価と同じであるかのように動作します。
IllegalArgumentException
−このURLが絶対でない場合MalformedURLException
−URLのプロトコル・ハンドラが見つからなかった場合、またはURLの構築中にその他の何らかのエラーが発生した場合public String getScheme()
URIのスキーム・コンポーネントが定義されている場合、そのコンポーネントに含まれるのは、英数字カテゴリまたは文字列「-.+」
に含まれる文字だけです。スキームは常に、英字文字で始まります。
URIのスキーム・コンポーネントにエスケープされたオクテットを含めることはできません。したがって、このメソッドはデコードを実行しません。
null
public boolean isAbsolute()
URIが絶対であるのは、そのURIにスキーム・コンポーネントがある場合だけです。
true
public boolean isOpaque()
URIが不透明であるのは、そのURIが絶対であり、そのスキーム固有部分がスラッシュ文字(「/」)で始まっていない場合だけです。不透明URIは、スキームとスキーム固有部分を持つほか、場合によってはフラグメントも持ちます。その他のコンポーネントはすべて未定義となります。
true
public String getRawSchemeSpecificPart()
URIのスキーム固有部分には、有効なURI文字だけが含まれます。
null
ではない)public String getSchemeSpecificPart()
このメソッドから返される文字列は、getRawSchemeSpecificPart
メソッドから返される文字列とほぼ同じです。異なるのは、エスケープされたオクテットのシーケンスがすべてデコードされている点だけです。
null
ではない)public String getRawAuthority()
URIの機関コンポーネントが定義されている場合、そのコンポーネントに含まれるのは、単価記号(「@」
)と、未予約、句読、エスケープ、その他のいずれかのカテゴリに含まれる文字だけです。機関がサーバー・ベースである場合、その機関はさらに、有効なユーザー情報、ホスト、ポートの各コンポーネントを持つように制約されます。
null
public String getAuthority()
このメソッドから返される文字列は、getRawAuthority
メソッドから返される文字列とほぼ同じです。異なるのは、エスケープされたオクテットのシーケンスがすべてデコードされている点だけです。
null
public String getRawUserInfo()
URIのユーザー情報コンポーネントには(定義されている場合)、未予約、句読、エスケープ、およびその他のカテゴリの文字だけが含まれます。
null
public String getUserInfo()
このメソッドから返される文字列は、getRawUserInfo
メソッドから返される文字列とほぼ同じです。異なるのは、エスケープされたオクテットのシーケンスがすべてデコードされている点だけです。
null
public String getHost()
URIのホスト・コンポーネント(定義されている場合)の形式は、次のいずれかです。
ドメイン名。1つ以上のラベルをピリオド文字(「.」
)で区切った形式になります。末尾にピリオド文字を1つ付けてもかまいません。各ラベルは英数字文字とハイフン文字(「-」
)から構成されます。ただし、ハイフンがラベル内の先頭または末尾の文字として使用されることはありません。2つ以上のラベルで構成されるドメイン名のもっとも右側のラベルは、英字文字で始まります。
数字+.
数字+.
数字+.
数字+
の形式の、ドットで4つに区分されたIPv4アドレス。ここで、数字は3文字以内で、その値は255を超えません。
IPv6アドレス。角カッコ(「[」
と「]」
)で囲まれ、16進数、コロン文字(「:」
)、および場合によっては埋込みIPv4アドレスで構成されます。IPv6アドレスの完全な構文は、「RFC 2373: IPv6 Addressing Architecture」で指定されています。
null
public int getPort()
URIのポート・コンポーネントは(定義されている場合)、負でない整数です。
-1
public String getRawPath()
URIのパス・コンポーネントには(定義されている場合)、スラッシュ(「/」
)、単価記号(「@」
)と、未予約、句読、エスケープ、およびその他のカテゴリの文字だけが含まれます。
null
public String getPath()
このメソッドから返される文字列は、getRawPath
メソッドから返される文字列とほぼ同じです。異なるのは、エスケープされたオクテットのシーケンスがすべてデコードされている点だけです。
null
public String getRawQuery()
URIのクエリー・コンポーネントには(定義されている場合)、有効なURI文字だけが含まれます。
null
public String getQuery()
このメソッドから返される文字列は、getRawQuery
メソッドから返される文字列とほぼ同じです。異なるのは、エスケープされたオクテットのシーケンスがすべてデコードされている点だけです。
null
public String getRawFragment()
URIのフラグメント・コンポーネントには(定義されている場合)、有効なURI文字だけが含まれます。
null
public String getFragment()
このメソッドから返される文字列は、getRawFragment
メソッドから返される文字列とほぼ同じです。異なるのは、エスケープされたオクテットのシーケンスがすべてデコードされている点だけです。
null
public boolean equals(Object ob)
指定されたオブジェクトがURIでない場合、このメソッドは直ちにfalse
を返します。
2つのURIが等しいと見なされるには、どちらも不透明URIであるか、どちらも階層URIである必要があります。スキームは、どちらも未定義であるか、大文字と小文字を区別しない場合に等しくなければいけません。フラグメントは、どちらも未定義であるか、等しくなければいけません。
等しいと見なされる2つの不透明URIの場合、それらのスキーム固有部分は等しい必要があります。
2つの階層URIが等しいと見なされるには、パスが等しく、クエリーがどちらも未定義であるか等しくなければいけません。機関は、どちらも未定義であるか、どちらもレジストリ・ベースであるか、どちらもサーバー・ベースでなければいけません。機関が定義されており、レジストリ・ベースである場合、それらの機関は等しくなければいけません。機関が定義されており、サーバー・ベースである場合、大文字と小文字を区別しない場合にホストが等しく、ポート番号が等しく、ユーザー情報コンポーネントが等しくなければいけません。
2つのURIのユーザー情報、パス、クエリー、フラグメント、機関、またはスキーム固有部分が等しいかどうか判定する場合、これらのコンポーネントはエンコードされた形式でなくそのままの形式で比較され、エスケープ・オクテットの16進数は大文字小文字に関係なく比較されます。
このメソッドはObject.equals
の汎用規約を満たします。
equals
、クラス: Object
ob
- このオブジェクトと比較するオブジェクトtrue
Object.hashCode()
, HashMap
public int hashCode()
Object.hashCode
メソッドの汎用規約を満たします。hashCode
、クラス: Object
Object.equals(java.lang.Object)
, System.identityHashCode(java.lang.Object)
public int compareTo(URI that)
2つのURIの対応するコンポーネントを比較する際に、一方のコンポーネントが未定義であるのに他方が定義済みであった場合、前者のほうが後者よりも小さいと見なされます。特に明記されていないかぎり、文字列コンポーネントは、String.compareTo
メソッドで定義されているように、本来の大文字小文字を区別した順序に従って順序付けられます。エンコードの対象となる文字列コンポーネントの比較は、エンコードされた形式ではなくそのままの形式で比較されます。
URIの順序は次のように定義されます。
異なるスキームを持つ2つのURIは、大文字小文字に関係なくそれらのスキームの順序に従って順序付けられる。
階層URIは、同じスキームを持つ不透明URIより小さいと見なされる。
同じスキームを持つ2つの不透明URIは、それらのスキーム固有部分の順序に従って順序付けられる。
同じスキームとスキーム固有部分を持つ2つの不透明URIは、それらのフラグメントの順序に従って順序付けられる。
同じスキームを持つ2つの階層URIは、それらの機関コンポーネントの順序に従って順序付けられる。
両方の機関コンポーネントがサーバー・ベースである場合、URIはそれらのユーザー情報コンポーネントに従って順序付けられる。これらのコンポーネントが同じである場合、URIは大文字小文字に関係なくそれらのホストの順序に従って順序付けられる。ホストが同じである場合、URIはそれらのポートの順序に従って順序付けられる。
一方または両方の機関コンポーネントがレジストリ・ベースである場合、URIはそれらの機関コンポーネントの順序に従って順序付けられる。
最後に、同じスキームと機関コンポーネントを持つ2つの階層URIは、それらのパスの順序に従って順序付けられる。パスが同じである場合、それらの階層URIは、それらのクエリーの順序に従って順序付けられる。クエリーが同じである場合は、それらのフラグメントの順序に従って順序付けられる。
このメソッドはComparable.compareTo
の汎用規約を満たします。
compareTo
、インタフェース: Comparable<URI>
that
−このURIと比較するオブジェクトClassCastException
−指定されたオブジェクトがURIでない場合public String toString()
このURIがこのクラスのいずれかのコンストラクタを呼び出すことで作成されたものである場合、元の入力文字列と等価な文字列、または最初に指定されたコンポーネントから適宜計算された文字列と等価な文字列が返されます。それ以外の場合、このURIは正規化、解決、または相対化によって作成されたものなので、RFC 2396のセクション 5.2、ステップ 7のルールに従って、このURIのコンポーネントから文字列が構築されます。
バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.