10-2: URLとインターネット上の資源へのアクセス


・ 今度はインターネット上の資源を直接利用することを考えましょう。 インターネット上の資源は「URL(Uniform Resource Locator)」と呼ばれる 形式で指定されます。 URLはインターネット上の資源を一意に定めます。 たとえば Webのサービスで提供されるホームページの資源ならば、 "http://www.wakhok.ac.jp/hokusei/index.html" という ように「資源の種類」、「マシン名(ドメイン名を含む)」、 「ファイル名(ディレクトリ名を含む)」を示す部分を組み合わせることで、 唯一の存在を表現します。
 java.net には URL を取り扱うためのクラスが存在します。 実はその名前も URL です。 URL で指定された資源を取り出す最も手軽な方法は、 URLクラスの getContent()メソッドによるものです。その サンプルプログラム URLTextContent.java を紹介しましょう。
 URLが表す資源の実体はさまざまなタイプのデータである可能性があります。 したがって getContent()の返すオブジェクトは、一般には Objectクラスです。 上のサンプルでは最も典型的なケースとして、 URLの資源がテキスト・ファイルの場合を処理します。 この場合には getContent()の返すオブジェクトは InputStream のサブクラスに なるはずです。 ストリームから行単位でデータを読み込み標準出力に表示する部分は、 前回の java.io の部分で解説したとおりです。 たとえば次のようにして適当なローカルなファイルや インターネット上のハイパーテキストを指定してアクセスしてみましょう。


java  URLTextContent  "file:/usr/local/java/README"   (Solarisの場合)
java  URLTextContent  "file:/C:\jdk1.2beta4\README"   (Windowsの場合)
java  URLStreamContent  "http://www.wakhok.ac.jp/home_ja.html"

・ 次にテキストではなく画像ファイルのの URLからイメージを生成して、 ウィンドウ上に表示する サンプルプログラム URLImageContent.java を紹介しましょう。 このプログラムを用いれば、 Netscapeなどの Webブラウザに頼らずに Javaのプログラムによって直接インターネット上の画像の表示を 実行することが可能になります。
 URLのオブジェクトを生成し、 getContent()メソッドによって資源にアクセスする点は、先のサンプルと同様です。 コマンドラインの引数に渡す URLもローカルな画像ファイルを指定しても、 他のサイトの画像の資源を指定しても、どちらでもかまいません。
 イメージのデータのソースとなる場合には、 ImageProducer を実装したクラスのオブジェクトが返されます。 ImageProducerから Imageのオブジェクトを得るには、 Toolkitクラスの createImage()メソッドを利用します。
 なお、イメージの表示を行うためのクラスも新たに定義する必要があります。 これは java.awtの Canvasクラスを拡張したものとして設計します。 ここでは ImageViewerというクラス名です。その ソース ImageViewer.java も示しておきましょう。
 イメージの読み込みの処理は独立したスレッドによって行われるため、 処理の流れが少し複雑になります。 これについては多少コメントが必要でしょう。 このサンプルの場合、 URLで指定されるイメージのサイズはデータの読み込みが終わるまで確定しません。 しかも困ったことに読み込みがいつの時点で完了するかは、 プログラムにはあらかじめ予測がつきません。 データの量や通信回線の速度はプログラムを実行するたびに異なるからです。 このため「イメージのサイズに合わせてキャンバスのサイズを調整する」という 本来なら単純なはずの処理が、以外と難しくなります。 なんらかの手段で、イメージの読み込みの完了とキャンバスのサイズの変更の 処理の同期を取らなければならないからです。
 URLImageContentのソースの中で呼び出されている prepareImage()という メソッドは、「イメージの状態の変化を他のオブジェクトに通知する」 ように設定する働きをします。ここでは ImageViewerのオブジェクトが通知を 受け取る側として設定されています。 このようなオブジェクトは ImageObserver と呼ばれます。 ImageObserver はイメージの状態の変化の通知の変化を受け取ると、 imageUpdate()メソッドを実行します。
 ImageViewerのソースの中の imageUpdate()メソッドの定義では、 イメージの読み込みが完了した時点でキャンバスのサイズを確定し、 ウィンドウの表示を実行するようになっています。 したがって他のサイトにある大きな画像を指定した場合には、 表示されるまでしばらく時間がかかるかもしれません。気長に待ってください。