プロトコルやホスト名を指定してURLオブジェクトを作成する
URLを構成するプロトコルやホスト名などを個別に引数として指定してURLクラスのオブジェクトを作成する方法を見ていきます。次のコンストラクタを使用します。
public URL(String protocol, String host, int port, String file) throws MalformedURLException
指定された protocol、host、port 番号、および file から URL オブジェクトを生成します。 host は、ホスト名、リテラル IP アドレスのいずれかとして表現できます。IPv6 リテラルアドレス を使用する場合は、「RFC 2732」で指定されているように、アドレスを角括弧 (「[」と「]」) で囲 む必要があります。ただし、「RFC 2373: IP Version 6 Addressing Architecture」で定義されてい るリテラル IPv6 アドレス形式も、使用可能です。 port 番号 -1 の指定は、URL がプロトコルのデフォルトのポートを使用することを示します。 指定されたプロトコルで最初に URL オブジェクトを生成するときには、そのプロトコルのためのス トリームプロトコルハンドラオブジェクトが生成されます。このストリームプロトコルハンドラオブ ジェクトは、URLStreamHandler クラスのインスタンスです。 1.以前にアプリケーションが URLStreamHandlerFactory のインスタンスをストリームハンドラファ クトリとして設定している場合は、そのインスタンスの createURLStreamHandler メソッドがプロ トコル文字列を引数として呼び出されて、ストリームプロトコルハンドラを作成する 2.まだ URLStreamHandlerFactory が設定されていない場合、あるいはファクトリの createURLStreamHandler メソッドが null を返した場合は、コンストラクタが次のシステムプロ パティーの値を探す java.protocol.handler.pkgs このシステムプロパティーの値が null でなければ、値は、垂直スラッシュ文字「|」で区切られ た、パッケージのリストとして解釈される。コンストラクタは次の名前を持つクラスをロードしよ うとする。 <package>.<protocol>.Handler ここで、<package> にはパッケージの名前が入り、<protocol> にはプロトコルの名 前が入る。このクラスが存在しない場合、あるいはクラスは存在してもそれが URLStreamHandler のサブクラスではない場合には、リストにある次のパッケージを試すことになる。 3.以上の手順でもプロトコルハンドラが見つからなかった場合、コンストラクタはシステムのデフォ ルトパッケージからロードしようとする。 <system default package>.<protocol>.Handler このクラスが存在しない場合、あるいはクラスは存在してもそれが URLStreamHandler のサブクラ スではない場合には、MalformedURLException がスローされる。 次のプロトコルのプロトコルハンドラは、検索パス上に存在することが保証されています。 http, https, ftp, file, and jar その他のプロトコルのプロトコルハンドラも使用可能になっている可能性があります。 このコンストラクタによる入力の検証は実行されません。 パラメータ: protocol - 使用するプロトコル名 host - ホスト名 port - ホスト上でのポート番号 file - ホスト上のファイル 例外: MalformedURLException - 未知のプロトコルとして指定された場合
引数にはURLを構成する「プロトコル」「ホスト名」「ポート番号」「ファイル名」を指定します。ここで作成したURLクラスのオブジェクトは指定したホストにあるファイルに対して指定したプロトコルを使い指定したポート番号で接続するためのものです。
なおポート番号に「-1」を指定した場合には、指定したプロトコルのデフォルトポート番号が使用されます。
このコンストラクタを使用する場合には「java.net.MalformedURLException」クラスの例外が発生する可能性がありますのでその処理を記述しておく必要があります。
実際には次のように使用します。
try{ URL url = new URL("http", "www.yahoo.co.jp", 80, "index.html"); }catch(MalformedURLException e){ e.printStackTrace(); }
サンプルプログラム
では実際に試してみましょう。URLクラスを使ってインターネット上の画像ファイルを指定し、そのURLクラスのオブジェクトからImageIconクラスのオブジェクトを作成します。そしてImageIconクラスのオブジェクトを使ってJLabelクラスのオブジェクトを作成します。
import javax.swing.*; import java.awt.BorderLayout; import java.net.URL; import java.net.MalformedURLException; public class JUrlTest2 extends JFrame{ public static void main(String[] args){ JUrlTest2 frame = new JUrlTest2(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 150, 150); frame.setTitle("タイトル"); frame.setVisible(true); } JUrlTest2(){ URL url = null; try{ url = new URL("http", "www.javadrive.jp" , -1, "/tutorial/imageicon/hasami.png"); }catch(MalformedURLException e){ e.printStackTrace(); } JLabel label = null; if (url != null){ ImageIcon icon = new ImageIcon(url); label = new JLabel(icon); }else{ label = new JLabel("Not image"); } JPanel p = new JPanel(); p.add(label); getContentPane().add(p, BorderLayout.CENTER); } }
上記をコンパイルした後で実行すると次のように表示されます。
今回はポート番号に「-1」を設定してありますのでプロトコルとして指定した「http」のデフォルトポート番号である「80」が自動的に使われます。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。