Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

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クラス」を使用しましょう。

エンコード・デコードする際は、次のルールが適用されます。

URLのエンコード・デコードする際のルール
  • 英数字文字の「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をエンコードする場合、半角スペースは「+」に置き換わります。

置き換わりは不具合ではなく、エンコード時のルールです。

ポテパンダの一言メモ

URLDecoder の場合も、同様の仕様に則って「+」でデコードされます。

実際にサンプルコードで表示を確認すると、次の通りです。

■記述例
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引数の文字コードを省略したメソッドの使用は、念のため避けましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。