データの取得


ダウンロード

仮想マシンがサポートしているプロトコルであれば
URL クラスから InputStream を取得することができます
URL からデータを得るには URL.openStream() メソッドを使います

public final InputStream openStream() throws IOException

このメソッドが返す InputStream はリソースのデータそのものです
通信に必要なヘッダやプロトコル関連情報は含みません
import java.net.*;
import java.io.*;

public class Test {
	public static void main(String[] args) {
		try {
			URL url = new URL(args[0]);
			FileOutputStream out = new FileOutputStream(args[1]);
			InputStream input = url.openStream();
			while(true) {
				int read = input.read();
				if (read == -1) break;
				out.write(read);
			}
			out.close();
		}
		catch(Exception e) {
			System.err.println(e);
		}
	}
}
このプログラムは、指定した URL のリソースをダウンロードします
コマンドラインの最初の引数で、ダウンロードするファイルの URL を
第2引数で、ローカルホストコンピュータのファイルパスを指定します
プログラムは指定したファイルを生成、又は上書きします

データを読み込んでいる(ダウンロードしている)間は
プログラムは応答することができないので、その点は注意してください
ディスクファイルを読み取るのとは違い、ネットワークからの入力には時間がかかります

しかし、この方法はバイナリとしてデータを取得する場合は有効ですが
リソースを Web から取得する場合、いささか不便なことがあります
例えば、イメージファイルを Web から読み込み、それを表示するということを考えると
InputStream オブジェクトからでは、 イメージを描画することができません
同様に、音声データの場合でも InputStream からでは再生ができないでしょう

方法のひとつとしては、一度ディスクに保存して、それを読み込むということが考えられますが
テンポラリファイルの生成や削除といった面倒な手続きが発生します

そこで URL.getContent() メソッドを用います
このメソッドは、サーバーから取得した MIME の情報を元に
URL が示すファイルから特定のインスタンスを生成します

public final Object getContent() throws IOException

サーバーが MIME を使用していなかったり、対応していない型であれば
このメソッドは InputStream 型を返します
なんからのクラスに対応しているファイルであれば、そのインスタンスが生成されます
import java.net.*;
import java.io.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

public class Test extends JFrame {
	private Image img;
	public static void main(String[] args) {
		Test frm = new Test();
		frm.addWindowListener(new WindowAdapter() {
			public void windowClosed(WindowEvent e) {
				System.exit(0);
			}
		});
		frm.setBounds(0 , 0 , 400 , 200);
		frm.setVisible(true);
		frm.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

		try {
			URL url = new URL(args[0]);
			Object obj = url.getContent();
			if (!(obj instanceof ImageProducer)) System.exit(0);

			frm.img = frm.createImage((ImageProducer)obj);
		}
		catch(Exception e) {
			System.err.println(e);
		}
	}

	public void paint(Graphics g) {
		if (img != null) g.drawImage(img , 0 , 0 , this);
	}
}
これは、簡単なネットワーク上の画像描画アプリケーションです
コマンドラインで指定した URL のイメージファイルをウィンドウに描画します
イメージファイル以外が指定された場合は、すぐに終了してしまうでしょう



前のページへ戻る次のページへ