アプレットにおけるリソースの指定とURL

インターネットを通じてリソースにアクセスするために、 JDKには URLクラスが用意されています。 また、Appletクラスには URL を得たり、URLに基づいてリソースを得るための メソッドが用意されています。
URL(Uniform Resource Locater) は WWW で資源を指定する時に用いる名称の規約です。 ファイルシステムにおけるパス名に対応するものですが、 マシンやシステムに依存しない形式になっています。 たとえば、階層ディレクトリの区切りに用いられる文字は常に /(スラッシュ)です。
Java言語では URLを取り扱い、それが表す資源にアクセスするためのクラス がいくつか用意されています。クラス URLもその一つです。 このクラスは文字どおり URLそのものを表すクラスです。 プロトコル(ftp,http,nntpなど)、ホスト、ポート番号などの情報を 取り出すメソッドも提供します。

URLのオブジェクトをプログラム内で明示的に生成して利用する場合は、 以下の手続きが必要になります。


try {
     URL url = new URL( "http://www.wakhok.ac.jp/home.html" );
}
catch( MalformedURLException e ){
     System.err.println("Error!");
}

イメージを取り扱うためには awtパッケージの Imageクラスを利用します。 イメージの取り扱いはシステムの実装に大きく依存します。 そのため Imageクラスは abstractクラスで、通常のアプレットのプログラムの 中で、コンストラクタを用いたオブジェクトの生成は行えません。 アプレットのプログラム内で Imageクラスのオブジェクトを得るためには、 Appletクラスに用意された専用のメソッドを用いることになります。

最も重要なメソッドが getImage()です。 このメソッドは、引数に指定された URLをデータの読み込み先として、 イメージのオブジェクトを生成します。 引数の指定には複数の方法が可能です。 次のサンプルのように、「データの URLをそのまま指定」することもできます。 また、 「データの置かれているディレクトリの URL」と「Stringクラスのパス名」という 2つの引数を与える方法も便利です。


URL url1, url2;  String filename;

Image image1 = getImage( url1 );
Image image2 = getImage( url2,  filename );

ディレクトリのURLは、 HTMLのドキュメントのある場所から相対的に指定できると便利です。 その目的のために、Appletクラスはメソッド getDocumentBase() および getCodeBase()も用意されています。 getDocumentBase() は HTMLファイルの存在するディレクトリの URL を、 getCodeBase()はアプレットのバイトコードが置かれている URLを返します。 たとえば、HTMLファイルからパラメータによって パス名が指定できるようにした場合には getDocumentBase() を用いて、 HTMLファイルの存在するディレクトリを出発点にするといいでしょう。 これに対して、指定がない場合のためのデフォルトのデータの指定には、 getCodeBase() を用いて、 アプレットのプログラムから見た相対指定でデータにアクセスできるように するのが望ましいでしょう。


String source = getParameter("source"); // パラメータからソース名
if( source != null )
    Image image = getImage( getDocumentBase(),  source );
else
    Image image = getImage( getCodeBase(),  "default.gif" );

音声データを再生するのは非常に簡単です。 Appletクラスに用意された play()メソッドを呼び出すだけです。 play()メソッドには音声データのファイルの URL を指定しますが、 そのルールは getImage()の場合と 同じです。


String source = getParameter("source");    // 音声データのソース名
if( source != null )
    play( getDocumentBase(),  source );
else
    play( getCodeBase(),  "default.au" );

play()メソッドの処理は独立したスレッドによって、 アプレットの他の処理と並列して行われます。 プログラム内で特別な工夫を行わなくても、自動的にバックグラウンドでの 再生が可能になるわけです。 マシンの処理能力が許せば、複数の play()メソッドが独立して音声の 再生を行うことも可能です。

今度は単純に再生するのではなく、BGM としてエンドレスに流す機能を考えます。 Appletパッケージの中の AudioClipクラスのオブジェクトが必要です。 そのために Appletクラスのメソッド getAudioClip()を用います。 データファイルの URL を指定して AudioClip のオブジェクトを得る方法は、 getImage() や play()と同じルールです。


public AudioClip clip = null;
String source = getParameter("source");  // 音声データのソース名
if( source != null )
    clip = getAudioClip( getDocumentBase(),  source );
else
    clip = getAudioClip( getCodeBase(),  "default.au" );

AudioClip は3つのメソッド play(), loop(), stop() を提供します。 それぞれ、単純な再生、エンドレスの再生、再生の中断の処理を行います。 たとえば、ページを開いたら BGMの再生をエンドレスで開始するためには、次のように start()メソッドの 中で、AudioClipの loop()メソッドを呼べばいいわけです。


public void start() {

       clip.loop();   // エンドレスの再生の開始
} 

逆にブラウザの表示が別のページに移った場合は、 後始末のために stop()メソッドの中で AudioClip の stop()メソッドを呼びます。 (こうしておかないと、 BGMが延々と演奏され続けることになってしまいます。)

public void stop() {

       clip.stop();  // 再生の終了
}