Java 入門

ホーム > Java の基本 > HTTP でファイルをダウンロードして保存する方法

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

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

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

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

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

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

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

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

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

ストリームの操作については、基本的な I/O を参考にしてください。

package com.example.downloadsave1;

import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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();
      }
      
      // Input Stream
      DataInputStream dataInStream 
        = new DataInputStream(
            conn.getInputStream());
      
      // Output Stream
       DataOutputStream dataOutStream 
         = new DataOutputStream(
          new BufferedOutputStream(
            new FileOutputStream("C:\\Temp\\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) {
      e.printStackTrace();
    }
    
  }

}

ここではダウンロードするファイルの種類が既知としています。つまり、これからダウンロードするのが JPG 画像であることを知っていて、それを拡張子 .jpg のファイルに保存しています。

しかし一般的には HTTP サーバー (ウェブサーバー) から返されるデータがどのようなものであるか正確に知るには、サーバーからの応答に含まれる Content-Type をチェックする必要があります。

ウェブサーバーとしては .jpg が最後に付く URL を要求して、その中身が実は .png ファイルだったとか、テキストだったということでもいいわけです。ウェブサーバーではちゃんと Content-Type として、 今送信しているデータの MIME タイプはこれこれですよ、ということを設定していれば良いのです。

ちなみに、ここではファイルのダウンロードと保存の骨子について説明しましたが、 これをアンドロイド上のインテントサービスなどと絡め、進捗をレポートしつつダウンロードする方法については、 HTTP による画像ファイルのダウンロード (Android プログラミング入門) をみてください。

ホーム > Java の基本 > HTTP でファイルをダウンロードして保存する方法