JavaのURLクラスとは?
URLクラスは、Uniform Resource Locator (ユニフォーム・リソース・ロケータ)、World Wide Web上のリソースへのポインタを表すものです。
リソースは、ファイル・ディレクトリのような単純なものである場合や、データベース・検索エンジンに対するクエリーなど、複雑なオブジェクトへの参照の場合もあります。
アクセスしたい情報のURLがわかっていれば、java.net.URLクラスを用いることで、簡単に取得可能です。
URLクラスで使用できるメソッドは次の通りです。
修飾子と型 | メソッドと説明 |
---|---|
boolean | equals(Object obj) URLと別のオブジェクトとが等しいかどうかを比較 |
String | getAuthority() URLの機関部分を取得 |
Object | getContent() URLのコンテンツを取得 |
Object | getContent(Class[] classes) URLのコンテンツを取得 |
int | getDefaultPort() URLに関連するプロトコルのデフォルトのポート番号を取得 |
String | getFile() URLのファイル名を取得 |
String | getHost() 該当する場合、URLのホスト名を取得 |
String | getPath() URLのパス部分を取得 |
int | getPort() URLのポート番号を取得 |
String | getProtocol() URLのプロトコル名を取得 |
String | getQuery() URLのクエリー部分を取得 |
String | getRef() URLのアンカー(参照)を取得 |
String | getUserInfo() URLのユーザー情報部分を取得 |
int | hashCode() ハッシュ表のインデックス付けに適したint値を作成 |
URLConnection | openConnection() URLが参照するリモート・オブジェクトへの接続を表すURLConnectionインスタンスを返却 |
URLConnection | openConnection(Proxy proxy) openConnection()とほぼ同様だが、接続の確立が指定されたプロキシ経由で行われる点が異なる プロキシ処理をサポートしないプロトコル・ハンドラは、プロキシのパラメータを無視し、通常の接続を確立 |
InputStream | openStream() URLへの接続を開き、その接続から読み込むためのInputStreamを返却 |
boolean | sameFile(URL other) フラグメント・コンポーネント以外の2つのURLを比較 |
static void | setURLStreamHandlerFactory (URLStreamHandlerFactory fac) アプリケーションのURLStreamHandlerFactoryを設定 |
String | toExternalForm() URLの文字列表現を構築 |
String | toString() URLの文字列表現を構築 |
URI | toURI() このURLと等価なURIを返却 |
URLのエンコード・デコードとは?
JavaでURLのエンコード・デコードをする場合は、「URLEncoderクラス」「URLDecoderクラス」を使用しましょう。
- URLEncoderクラス:HTML形式をエンコードするためのユーティリティ・クラス
- URLDecoderクラス:HTML形式をデコードするためのユーティリティ・クラス
エンコード・デコードする際は、次のルールが適用されます。
- 英数字文字の「a」から「z」、「A」から「Z」、「0」から「9」は元のまま残る
特・殊文字の「.」、「-」、「*」、および「_」は元のまま残る - プラス記号「+」は空白文字「 」に変換する
- 「%xy」という形式のシーケンスは、バイトの表現として扱われる
- 「xy」は8ビットを2桁の16進数で表現したもの
- バイト・シーケンスを連続して1つ以上含む部分文字列はすべて、エンコーディング結果がそれらの連続したバイトになるような文字へと置換する
- 文字のエンコード・デコードに使用するエンコーディング方式は指定可能ですが、指定しなかった場合には、プラットフォームのデフォルトのエンコーディングが使用される
では、実際にサンプルコードで動きを確認しましょう。
■記述例 import java.io.*; import java.net.*; public class Main { public static void main(String[] args) throws IOException { String str = "https://style.potepan.com/ポテパンスタイルの最新記事です"; // エンコードの例 String encodedResult = URLEncoder.encode(str, "UTF-8"); System.out.println("URLをエンコードします:" + encodedResult); // デコードの例 String decodedResult = URLDecoder.decode(encodedResult, "UTF-8"); System.out.println("URLをデコードします:" + decodedResult); } } ■実行結果 mbp:desktop potepan$ java Main URLをエンコードします:https%3A%2F%2Fstyle.potepan.com%2F%E3%83%9D%E3%83%86%E3%83%91%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AE%E6%9C%80%E6%96%B0%E8%A8%98%E4%BA%8B%E3%81%A7%E3%81%99 URLをデコードします:https://style.potepan.com/ポテパンスタイルの最新記事です
URLをエンコードした結果と、デコードした結果が取得できました。
適用されるルールの通り、エンコード時は指定した文字以外・日本語部分は、16進数表記に変換されています。
URLエンコード時の半角スペース
URLをエンコードする場合、半角スペースは「+」に置き換わります。
置き換わりは不具合ではなく、エンコード時のルールです。
実際にサンプルコードで表示を確認すると、次の通りです。
■記述例 import java.io.*; import java.net.*; public class Main { public static void main(String[] args) throws IOException { // URLに半角スペースを追加しました String str = "https://style.potepan.com/ポテパンスタイル 最新記事"; // エンコードの例 String encodedResult = URLEncoder.encode(str, "UTF-8"); System.out.println("URLをエンコードします:" + encodedResult); // デコードの例 String decodedResult = URLDecoder.decode(encodedResult, "UTF-8"); System.out.println("URLをデコードします:" + decodedResult); } } ■実行結果 mbp:desktop potepan$ java Main URLをエンコードします:https%3A%2F%2Fstyle.potepan.com%2F%E3%83%9D%E3%83%86%E3%83%91%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB+%E6%9C%80%E6%96%B0%E8%A8%98%E4%BA%8B URLをデコードします:https://style.potepan.com/ポテパンスタイル 最新記事
URLエンコード時のスラッシュ
実行結果からわかるように、URLをエンコードする場合、スラッシュ(/)は「%2F」の16進数に変換されます。
URLエンコードでShift_JISは文字化けの可能性あり
URLEncoder、URLDecoder で Shift_JIS の文字列は上手く処理できない場合があります。
そのため、文字コードは「UTF-8」で指定するのが無難です。
サンプルで、Shift_JISで指定した場合の処理を記載します。
■記述例 import java.io.*; import java.net.*; public class Main { public static void main(String[] args) throws IOException { // URLに半角スペースを追加しました String str = "https://style.potepan.com/アイウエオ"; // エンコードの例 String encodedResult = URLEncoder.encode(str, "SHIFT-JIS"); System.out.println("URLをエンコードします:" + encodedResult); // デコードの例 String decodedResult = URLDecoder.decode(encodedResult, "SHIFT-JIS"); System.out.println("URLをデコードします:" + decodedResult); } } ■実行結果 mbp:desktop potepan$ java Main URLをエンコードします:https%3A%2F%2Fstyle.potepan.com%2F%B1%B2%B3%B4%B5 URLをデコードします:https://style.potepan.com/アイウエオ
今回のサンプルでは、文字化け等の不具合は起きませんでした。
エンコード・デコード時は第2引数の文字コードを必ず渡す
URLEncoderクラス、URLDecoderクラスには、第2引数の文字コードを省略可能なメソッドが存在します。
指定の必要がないので便利に思えますが、こちらのメソッドの使用は非推奨です。
なぜなら、環境によって文字コードが異なる可能性があるため、予期せぬ不具合が発生することがあるためです。
さまざまな環境で実行する予定がないとはいえ、どんな不具合が生じるのかわかりません。
第2引数の文字コードを省略したメソッドの使用は、念のため避けましょう。
URLDecoder の場合も、同様の仕様に則って「+」でデコードされます。