WisdomSoft - for your serial experiences.

10.5 ネットワーク

URL からネットワーク上のサーバーに接続し、入力ストリームを受け取る方法を紹介します。指定した URL から受け取ったデータをファイルとして保存します。

10.5.1 ダウンロード

入出力の対象は、必ずしもローカル・コンピュータとは限りません。ネットワークに接続されているコンピュータであれば、ネットワーク上のファイルやコンピュータとデータを入出力することができます。しかし、そのためにはネットワークの基本的な構造と原理を理解し、ソケット・プログラミングを学習し、プロトコル仕様に従ってプログラムを構築する必要があります。 残念ながら本書では、プロトコルやネットワークの原理については詳しく解説することはできません。これらの疑問を解決したければ、ネットワークの専門書籍や RFC ドキュメントを参照してください。

もし、独自の方法でサーバーにアクセスしたり、特殊なプロトコルを定めてデータをやり取りする場合は上記した方法で行う必要がありますが、幸い Java 標準ライブラリは HTTP や FTP などの代表的なプロトコルとの通信をサポートしています。HTTP や FTP サーバーなどからファイルをダウンロードする程度であれば、数行のプログラムで実現できてしまいます。

ネットワーク関連のクラス群は java.net パッケージ内に配置されています。この中にある java.net.URL クラスを用いることによって、指定した URL からファイルをダウンロードすることができます。今では、コンピュータの素人でもインターネットを利用する時代なので、多くの読者はある程度知っていると思いますが、URL とは Uniform Resource Locator の略でネットワーク上のファイルなど、情報資源の位置を表す文字列のことです。

URL の構文はいくつかのパートに分かれています。

URLの構造
プロトコル://ユーザー情報@ホスト名:ポート番号/パス?問い合わせ文字列#参照

例えば http://java.sun.com/ などは見慣れた URL だと思います。これは http プロトコルによる通信で java.sun.com という名前のホストにアクセスすることを表しています。一般的な URL はプロトコルとホスト名、ファイルパスで構成されています。ユーザー情報やポート番号などは省略することができます。

アクセス対象は単純なファイルとは限りません。データベースや検索エンジンなどのプログラムの可能性もあります。こうしたサーバーサイドのプログラムに情報を送るために、問い合わせ文字列などが用いられます。URL については RFC 2396RFC 2732 で詳細に定められているので、詳しくはこれを参照すると良いでしょう。

表1は URL クラスの中から重要なコンストラクタとメソッドを抜粋したものです。詳しくは API 仕様を参照してください。

表1 URLクラス(抜粋)
コンストラクタ 解説
URL(String spec) String 表現から URL オブジェクトを作成します。
URL(String protocol, String host, int port, String file) 指定された protocol、host、port 番号、および file から URL オブジェクトを作成します。
URL(String protocol, String host, int port, String file, URLStreamHandler handler) 指定された protocol、host、port 番号、file、および handler を使って、URL オブジェクトを作成します。
URL(String protocol, String host, String file) 指定された protocol 名、host 名、および file 名を使って、URL を作成します。
メソッド
Object getContent() この URL のコンテンツを取得します。
int getDefaultPort() この URL に関連するプロトコルのデフォルトのポート番号を取得します。
String getFile() この URL のファイル名を取得します。
String getHost() 該当する場合、この URL のホスト名を取得します。
String getPath() この URL のパス部分を取得します。
int getPort() この URL のポート番号を取得します。
String getProtocol() この URL のプロトコル名を取得します。
String getQuery() この URL のクエリー部分を取得します。
String getRef() この URL の参照を取得します。
String getUserInfo() この URL のユーザ情報部分を取得します。
URLConnection openConnection() URL が参照するリモートオブジェクトへの接続を表す URLConnection オブジェクトを返します。
InputStream openStream() この URL への接続を確立し、その接続から読み込みを行うための InputStream を返します。

URL クラスのコンストラクタに文字列で目的の URL を指定すれば、そのネットワークリソースを参照する URL オブジェクトを生成することができます。後は URL オブジェクトの openStream() メソッドを用いてサーバーに接続し、InputStream の read() メソッドからデータを取得することができます。

コード1
import java.net.*;
import java.io.*;

class Test {
	public static void main(String args[]) throws Exception {
		byte buffer[] = new byte[0xFF];

		URL url = new URL(args[0]);
		OutputStream out = new FileOutputStream(args[1]);
		System.out.println(url.getHost() + ": 接続しています");
		InputStream in = url.openStream();

		for(int i = 0 , len = 0 ; (len = in.read(buffer)) != -1 ;) {
			i += len;
			System.out.print("ダウンロード中です…" + i + "byte\r");
			out.write(buffer , 0 , len);
		}
		out.close();
	}
}
実行結果
>java Test http://java.sun.com/ java.html
java.sun.com: 接続しています
ダウンロード中です…43790byte

コード1は、コマンドライン引数から指定した URL のファイルをダウンロードして、ディスクに保存します。最初の引数(args[0])に URL を指定し、次の引数(args[1])に保存するファイル名を指定してください。ファイルを生成することができて、URL で指定したホストに接続することができれば、ダウンロードが開始されます。