appendix> net> URLConnection TOPUPPREVNEXT

java.net.URLConnection

【主な機能】

URL(Uniform Resource Locator) で示されるリソースとの間で通信を行うクラスのスーパークラスです。 URLConnection クラスは抽象クラスで、 URLopenConnection メソッドから返される URLConnection を用いて通信をおこないます。 URL のプロトコルが HTTP であれば、 HttpURLConnection が返され、 JAR であれば、 JarURLConnection が返されます。

たとえば、ネットワーク上のリソースから文字や文字列を読み込むまでの段取りは概ね以下のようになります。

文字列のURL
 ↓ new URL
URL クラスのインスタンス
 ↓ openConnection
URLConnectionクラスのインスタンス
 ↓ コネクションの設定とコネクト
 ↓ コネクション情報の獲得(任意)
 ↓ getInputSteam
InputStreamクラスのインスタンス
 ↓ new BufferedReader
文字列ストリーム
 ↓ read や readLine など(繰り返し実行)
文字や行(文字列)

【ネットワーク上のデータ】

ネットワーク上のデータにアクセスする場合に注意をしなければいけない点があります。

第1は、読んだデータをどのように扱うかという点です。 HTTP で公開している場合、 著作権者はブラウザで閲覧をするという前提で記事を提供していると考えるのが自然です。 それ以外の利用は勝手にはできません。 著作権法に違反すると最高3年[注]の懲役です。 取り扱いには十分注意しましょう。

[注] その後、最高10年に改正されました。
インターネットの普及に対する対応や、著作物の尊重に対する啓蒙のために、著作権法は頻繁に改正されています。 文化庁の 「著作権」 を参考にしてください。

第2点は、ネットワークに過大な負荷をかけたり、サーバに過負荷をかけたりしないようにするという点です。 最近は通信路の容量も大きくサーバも強力ですから、あまり神経質にならずにアクセスしていいと思いますが、 「高速道路の上で一時停止しているのではないか」とか「よその家の玄関の戸を叩き続けていないか」 といった気配りを忘れないようにしましょう。

【関連するクラス】

    java.lang.Object
       ├java.net.URL
       ├java.lang.ClassLoader
       │    └java.security.SecureClassLoader
       │         └java.net.URLClassLoader
       ├java.net.URLConnection
       │         ├java.net.HttpURLConnection
       │         └java.net.JarURLConnection
       ├java.net.URLDecoder
       └java.net.URLEncoder

【よく使われるメソッド】

メソッド機能
void connect ( ) この URLConnection が示すリソースと接続を確立します。 すでに確立されている場合はなにもしません。
接続されていない URLConnection に対して接続が必要な操作を行うと、 自動的に接続されます。
接続を確立する前にタイムアウトになった場合、 java.net.SocketTimeoutException がスローされます。 接続の確立中に入出力エラーが発生した場合、 java.io.IOException がスローされます。
String getContentEncoding ( ) URL で示されるリソースの エンコーディング(符号化法)を返します。 この値は、 content-encoding ヘッダーフィールドの値です。 不明の場合は null が返されます。
int getContentLength ( ) URL で示されるリソースの大きさをオクテット(8ビットバイト)数で返します。 この値は、 content-length ヘッダーフィールドの値です。 サイズが不明の場合は -1 が返されます。
String getContentType ( ) content-type ヘッダーフィールドの値が返されます。 コンテンツ形式が不明の場合は null が返されます。
long getDate ( ) date ヘッダーフィールドの値が返されます。 1970年1月1日から起算したミリ秒で、時刻はグリニッジ標準時(GMT)です。 コンテンツ形式が不明の場合は 0 が返されます。
long getExpiration ( ) ecpires ヘッダーフィールドの値が返されます。 1970年1月1日から起算したミリ秒で、時刻はグリニッジ標準時(GMT)です。 リソースの有効期限が不明の場合は 0 が返されます。
String getHeaderField( int n ) n 番目のヘッダーフィールドの値を返します。 フィールドの個数が n+1 よりも少ない場合は null になります。
参考 getHeaderFieldKey
String getHeaderField( String name ) name ヘッダーフィールドの値が返されます。
String getHeaderFieldKey( int n ) n 番目のヘッダーフィールドの名前を返します。 フィールドの個数が n+1 よりも少ない場合は null になります。
参考 getHeaderField
Map<String,List<String>> getHeaderFields ( ) ヘッダーフィールドのキーと値のマップが返されます。 このマップおよびリストは変更できません。
InputStream getInputStream ( ) このリソースを入力するための InputStream が返されます。 返された入力ストリームから読み取る際、データの読み取り準備ができる前に読み取りタイムアウト時間が経過すると、 java.net.SocketTimeoutException が発生することがあります。
発生する可能性のある例外
 IOException - 入力ストリームの作成中に入出力エラーが発生した場合
 UnknownServiceException - プロトコルが入力をサポートしていない場合
long getLastModified ( ) last-modified ヘッダーフィールドの値が返されます。 1970年1月1日から起算したミリ秒で、時刻はグリニッジ標準時(GMT)です。 この URLConnection が示すリソースの変更された日付が不明の場合は 0 が返されます。
OutputStream getOutputStream ( ) このリソースに書き込みを行う出力ストリームが返されます。
発生する可能性のある例外
 IOException - 出力ストリームの作成中に入出力エラーが発生した場合
 UnknownServiceException - プロトコルが出力をサポートしていない場合
void setDoInput ( boolean b ) この URLConnection をつかってリソースから読み込みを行う場合に true 、 そうでない場合には false を設定します。 最初は true に設定されています。
void setDoOutput ( boolean b ) この URLConnection をつかってリソースに書き込みを行う場合に true 、 そうでない場合には false を設定します。 最初は false に設定されています。
void setIfModifiedSince ( Date date ) date より新しいリソースを対象とします。 【例2】
viod setUseCaches ( boolean b ) キャッシュを利用してもよい場合は true 、 キャッシュを利用せずリソースから読み直しをする場合は false を設定します。 最初は true に設定されています。
すでに接続が確立されている場合 IllegalStateException が発生します。

【例1】

コマンドラインで指定されたファイルを読み込み、 標準出力に表示(System.out.println)します。
ソースプログラム HttpTextRead.java
【プログラムの概要】
17〜18行目
読むファイルのURLを決める。
デフォルトを定めておき(17行目)、 コマンドラインに指定があれば、それを採用する。
19〜25行目
コマンドのパラメタに「?」、「/?」などが入力されたらエンコード用の文字列を表示する。
27〜28行目
読む際のエンコーディングを決める。
デフォルトを ISO-2022-JP にしておき、コマンドラインに指定があればそれを採用する。
30行目
URLConnection クラスのローカル変数 con を宣言する。
32行目
URLを記述した文字列から URL を生成する。 読み込み用のコネクションを作成する。
34〜35行目
読み込み用のコネクションにする。 (デフォルト値なので設定しなくても可)
36行目
キャッシュがあっても参照せず、リソースから直接読み込むという指定。
37行目
リクエストとレスポンスが1回だけで接続を終了するという指定。
37行目
接続の確立。
40〜41行目
MalformedURLException が発生した場合の処理。
メッセージを表示して、実行終了。
43〜44行目
IOException が発生した場合の処理。
48〜53行目
ヘッダを順に読み表示する。
56行目
テキスト長を取得。( 使っていない。表示しわすれ!)
58〜60行目
コネクションを入力ストリームにした、BuffererdReader を生成。
61〜65行目
コネクションから行単位に読み込んで表示。

このプログラムと同じフォールダに、テキストファイル localfile.txt が置いてあるとします。 コマンドラインにパラメータを与えない場合は、このファイルを読んで表示します。

HttpTextRead-1.gif

エンコーディングの例を表示する例と、 コマンドラインにURLとエンコーディングを指定してネットワーク上のファイルを読む例を以下に示します。

HttpTextRead-2.gif

テスト用に用意した ファイルの一覧 です。

【例2】

setIfModifiedSince メソッドの例。
例1のプログラムを修正し、 コマンドラインの第3パラメータに与えた日付より新しい場合にだけ読むようにしてみましょう。 DateFormat クラス の parse メソッドで文字列から Date に変換しています。
ソースプログラム HttpTextRead2.java

HttpTextRead.java との差異。 行番号が赤の行を追加(11行)。

例1で最終更新日が判明しているので、その日付より前を指定。

HttpTextRead2-1.gif

最終更新日より後を指定。

HttpTextRead2-2.gif

【例3】

HTML で書かれたファイルを読み込み、テキスト部分と、<A HREF= ... > の部分を 抜き出すプログラム例。
ソースプログラム HttpExtractHrefAndText.java

更新日:2005-11-22