Java で HTTP でファイルをダウンロードして保存する方法

ここでは HTTP でファイルをダウンロードして保存する方法を説明します。

最近はアンドロイド上のアプリケーション開発などでも Java は利用シーンが増えています。

特にそうしたモバイル上のアプリケーションでは、どうしてもネットワークに関わる応用が増えます。

当然ですよね、そもそもが携帯電話ですから持ち運んで何かするとなれば、端末上のデータだけでなくネットワークとの接続を必要とする場合は増えるわけです。

ここでは HTTP でサーバーに接続して、ダウンロードしてきたファイルを保存する方法を説明します。

HTTP でファイルをダウンロードして保存する方法

HTTP でサーバーに接続して、ファイルをダウンロード、そして保存という流れはおおまかに次のようになります。

  1. java.net.HttpURLConnection オブジェクトを URL を指定して作成
  2. メソッド等の HTTP のヘッダー情報を設定
  3. HttpURLConnection の connect メソッドでサーバーに接続
  4. 入力ストリームを取得
  5. ファイルに保存するのでファイル出力ストリームを作成
  6. インプットストリームからデータを読み、アウトプットに書込む

ストリームの操作については、基本的な 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 プログラミング入門) をみてください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門