本稿では、URLからファイルをダウンロードする方法について解説します。
- ファイルのダウンロードを自動化したい
- 初期処理等のため、プログラム上でファイルをダウンロードする必要がある
Javaの標準ライブラリであるIOパッケージやNIOパッケージによる実装方法、Apache HttpComponentsなどの外部ライブラリを用いた実装方法についていくつかサンプルを掲載しています。
Java IO を使う方法
ファイルをダウンロードするためには java.io パッケージの機能のみで十分可能ですが、ブラウザでファイルをダウンロードするように単純なメソッドはありません。
以下は、接続したURLからInputStreamを取得し、FileOutputStreamに書き込むサンプルになります。
Java
上のサンプルではurl.openStream()
で直接ストリームを開いていますが、ファイルが存在しない場合を考慮したい場合は次のようにレスポンスコードを判定した上でconn.getInputStream()
でストリームを取得する方法もあります。
Java
また、上のサンプルでは単純はread/writeのため省いていますが、パフォーマンス向上のためにはBufferedInputStream/BufferedOutputStreamを使うことをおすすめします。
Java
BufferedInputStreamとDataInputStreamは排他的ではなく、両方を使用できます。
BufferedInputStreamは読み込みをバッファリングしてアクセスする速度を最適化し、DataInputStreamはプラットフォーム依存しないようにデータを読み込み、それ自体は入力をバッファリングしません。
テキストであればBufferedInputStreamを使用し、バイナリレベルで制御が必要な場合はDataInputStreamも使用するなど、入力ソースに応じて書き換えてください。
Java NIO を使う方法
java.nio パッケージを使用すると、チャネル間でデータを転送することができるため、いちいちメモリに読み込む必要がなくなります。
java.io パッケージを使用した方法に比べて、一般的には高速に処理することができます。
Java
また、JavaSE7以降はFilesヘルパが追加されており、よりシンプルに実装することもできます。
Java
Apache HttpComponents を使う方法
org.apache.http パッケージを使用してファイルをダウンロードします。
GETやPOSTなどHTTPメソッドを簡単に使い分けできます。ただしこのライブラリじゃないとできないというものではなく、ライブラリ自体も標準機能の薄いラッパーなので、このケースでは積極的に使用しなくても困らないように思います。
セットアップ
Mavenを使用する場合は、pom.xmlに以下の依存性を追加してください。
pom.xml
特にプロジェクト管理ツールを使わない場合はより公式よりzipをダウンロードして、プロジェクトにjarを追加してください。
ソースコード
Java
Entityからデータをバイト配列に読み込むユーティリティも用意されています。入力ソースのサイズが大きい場合は注意が必要です。
Google Http Client を使う方法
Apache HttpComponents と同じく、基本的には java.io のラッパーです。
セットアップ
Mavenを使用する場合は、pom.xmlに以下の依存性を追加してください。
pom.xml
特にプロジェクト管理ツールを使わない場合はMavenのCentralリポジトリよりjarをダウンロードしてください。
ソースコード
Java
補足
サンプルでは省略していますが、レスポンスをファイルに保存する前に、レスポンスコードを確認してください。
レスポンスとして404(File Not Found)が帰ってきた場合は、取得するコンテンツは空か、あるいはFile Not Foundである旨のhtmlになると思いますが、接続先の実装に依存します。