2012年12月4日火曜日

プロトコルやホスト名を指定してURLオブジェクトを作成する

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クラスのオブジェクトを作成します。

JUrlTest2.java

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);
}
}

0 件のコメント:

コメントを投稿