JavaのURLクラスとは?
URLクラスは、Uniform Resource Locator (ユニフォーム・リソース・ロケータ)、World Wide Web上のリソースへのポインタを表すものです。
リソースは、ファイル・ディレクトリのような単純なものである場合や、データベース・検索エンジンに対するクエリーなど、複雑なオブジェクトへの参照の場合もあります。
アクセスしたい情報のURLがわかっていれば、java.net.URLクラスを用いることで、簡単に取得可能です。
URLクラスを使ったWebコンテンツの取得は、次の手順で行われます。
- URLクラスをインスタンス化(new)する
- openStream()を呼び出して、データを取り出すストリームを取得する
- read()を呼び出してストリームから1バイトずつ情報を取り出す
openStream()の戻り値として取得できるのはInputStreamですが、InputStreamの先は自分のPCにあるファイルではなくインターネット上のWebページにつながっています。
つながっている先がファイルかWebページかの違いなため、ファイルを1バイトずつ読むのと同じように処理可能です。
実際に取得するデータが画像ファイルではなくHTMLのような文字データの場合、文字ストリームとして取得した方が便利です。
そのため、InputStreamReaderを組み合わせて利用する場合もよくあります。
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にアクセス・取得する
では実際に、URLにアクセス・取得するサンプルコードを確認してみましょう。
ここでは、本サイト「style.potepan.com」を取得してみました。
記述例は次の通りです。
■記述例 import java.io.*; import java.net.*; public class Main { public static void main(String[] args) throws IOException { try { URL url = new URL("http://style.potepan.com"); InputStream is = url.openStream(); InputStreamReader isr = new InputStreamReader(is); int i = isr.read(); while(i != -1) { System.out.print((char) i); i = isr.read(); } isr.close(); } catch (IOException e) { e.printStackTrace(); } } }
URLは「https」ではなく「http」で指定します。
■実行結果 mbp:desktop potepan$ java Main <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved <a href="https://style.potepan.com/">here</a>.</p> </body></html>
「style.potepan.com」のHTMLを取得できたのがわかります。
なお、「http」ではなく「https」から始まるURLで取得するには、「URLConnectionクラス」を利用します。
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とURIの違いは?
URIは、指定のURIと他URIの指し示すものが同一であるか、ベースURIと相対URIを解決して新しいURIを作成するといった操作がメインのクラスです。
一方、URL(Uniform Resource Locator)は、何かしらのリソースが存在することを表現するものです。
リソースは、ファイル・ディレクトリのような単純なものである場合や、データベース・検索エンジンに対するクエリーなど、複雑なオブジェクトへの参照である場合などがあります。
URLはURIでできる単純な文字列表現だけではなく、リソースにアクセスするための手段もあわせて提供しているのです。