Java で HTTP でファイルをダウンロードして保存する方法
ここでは HTTP でファイルをダウンロードして保存する方法を説明します。
最近はアンドロイド上のアプリケーション開発などでも Java は利用シーンが増えています。
特にそうしたモバイル上のアプリケーションでは、どうしてもネットワークに関わる応用が増えます。
当然ですよね、そもそもが携帯電話ですから持ち運んで何かするとなれば、端末上のデータだけでなくネットワークとの接続を必要とする場合は増えるわけです。
ここでは HTTP でサーバーに接続して、ダウンロードしてきたファイルを保存する方法を説明します。
HTTP でファイルをダウンロードして保存する方法
HTTP でサーバーに接続して、ファイルをダウンロード、そして保存という流れはおおまかに次のようになります。
- java.net.HttpURLConnection オブジェクトを URL を指定して作成
- メソッド等の HTTP のヘッダー情報を設定
- HttpURLConnection の connect メソッドでサーバーに接続
- 入力ストリームを取得
- ファイルに保存するのでファイル出力ストリームを作成
- インプットストリームからデータを読み、アウトプットに書込む
ストリームの操作については、基本的な I/O を参考にしてください。
package com.keicode.java.test;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
public class DownloadAndSave {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost/image1.jpg");
HttpURLConnection conn =
(HttpURLConnection) url.openConnection();
conn.setAllowUserInteraction(false);
conn.setInstanceFollowRedirects(true);
conn.setRequestMethod("GET");
conn.connect();
int httpStatusCode = conn.getResponseCode();
if (httpStatusCode != HttpURLConnection.HTTP_OK) {
throw new Exception("HTTP Status " + httpStatusCode);
}
String contentType = conn.getContentType();
System.out.println("Content-Type: " + contentType);
// Input Stream
DataInputStream dataInStream
= new DataInputStream(
conn.getInputStream());
// Output Stream
DataOutputStream dataOutStream
= new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("/Users/keisukeo/image1.jpg")));
// Read Data
byte[] b = new byte[4096];
int readByte = 0;
while (-1 != (readByte = dataInStream.read(b))) {
dataOutStream.write(b, 0, readByte);
}
// Close Stream
dataInStream.close();
dataOutStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
ここではダウンロードするファイルの種類が既知としています。つまり、これからダウンロードするのが JPG 画像であることを知っていて、それを拡張子 .jpg のファイルに保存しています。
しかし一般的には HTTP サーバー (ウェブサーバー) から返されるデータがどのようなものであるか正確に知るには、サーバーからの応答に含まれる Content-Type をチェックする必要があります。
応答の Content-Type は HttpURLConnection オブジェクトの getContentType() メソッドで取得できます。
ここではファイルのダウンロードと保存の骨子について説明しましたが、 これをアンドロイド上のインテントサービスなどと絡め、進捗をレポートしつつダウンロードする方法については、 HTTP による画像ファイルのダウンロード (Android プログラミング入門) をみてください。