連載
» 2007年11月29日 00時00分 公開

プログラマーの常識をJavaで身につける(9):コードから情報を追い出せ!プロパティファイルの常識 (2/3)

[伊賀敏樹,株式会社 NTTデータ ビジネスブレインズ]

プロパティ操作の基本、java.util.Propertiesクラス

 Java言語からプロパティファイルを扱う1つ目のAPIは、java.util.Propertiesクラスです。クラス名がそのままプロパティファイルを扱うことを示していますね。

図2 java.util.Propertiesクラスによるプロパティファイルの読み込み 図2 java.util.Propertiesクラスによるプロパティファイルの読み込み

 プロパティファイルを利用したサンプルを以下に示します。

PropertiesSampleクラスのソースコード
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PropertiesSample {
    public static void main(final String[] args) {
        final Properties prop = new Properties();
        InputStream inStream = null;
        try {
            inStream = new BufferedInputStream(
                new FileInputStream("sampleprop.properties"));
            prop.load(inStream);
            final String value = prop.getProperty("mykey");
            System.out.println(value);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inStream != null) {
                    inStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

説明

            prop.load(inStream);

 この個所で、Propertiesクラスがプロパティファイルの内容を読み込みます。

            final String value = prop.getProperty("mykey");

 この個所で、mykey というキーに対応した値を取り出します。

前提条件

 この記事で挙げるサンプルプログラムは、現実的なプログラムで必要となる粒度の例外処理を実装していません。これは、現実的な例外処理を実装すると、APIの見通しが悪くなってしまうためです。現実的なプログラムで必要となる例外処理の粒度については、以前の記事を参考にしてください。

プロパティファイルの配置場所

 このサンプルプログラムでは、カレントディレクトリからプロパティファイルを読み込むよう記述されています。そのため、sampleprop.propertiesファイルはプログラム実行環境にとってカレントディレクトリに配置してください。

図3 プロパティファイルをカレントディレクトリに配置する例 図3 プロパティファイルをカレントディレクトリに配置する例
sampleprop.propertiesファイルの中身
mykey=abcdefg

プロパティファイルが存在しない場合の例外

 なお参考までに、いくつかの正常系ではない動作についてお伝えします。対象となるプロパティファイルが読み込めなかった場合には、下記のような例外が発生します。

java.io.FileNotFoundException: sampleprop.properties (指定されたファイルが見つかりません。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at PropertiesSample.main(PropertiesSample.java:13)

 このような例外が発生した場合には、プロパティファイルがプログラム実行環境にとってのカレントディレクトリに配置されていない、あるいは読み込むことができないことを示しています。

存在しないキーを指定した場合の例外

 また、下記のように、存在しないキー「usokey」により読み込みを行うと、nullが戻ってきます。

            final String value = prop.getProperty("usokey");

 プロパティファイルの読み込みはファイル入力を伴うものです。このように外部に依存するプログラミングでは、正常系ではない動作を理解しておくことをお勧めします。準備しておけば、異常系などが発生した場合にも対処がしやすくなります。

クラスローダを利用したプロパティファイルのロード

 先ほど紹介した例とは異なり、プロパティファイルをクラスパスから読み込みたいという場合もあります。その場合の実装例を示します。

図4 クラスローダを用いたプロパティファイルの読み込み 図4 クラスローダを用いたプロパティファイルの読み込み

 ポイントは、クラスローダを利用してプロパティファイルを取得するように変更されている点です。この例では このクラス自身を読み込む際に利用されたクラスローダを用いてプロパティファイルを探すようにしています。

            inStream = PropertiesSample2.class.getClassLoader()
                .getResourceAsStream("sampleprop.properties");

 Javaのクラスローダに関する話題は、やや難易度の高いものの1つです。初心者の方は分からなくても気にせず読み飛ばして先に進んでください。

編集部注クラスローダについて詳しく知りたい読者はJava TIPSの「クラスローダの仕組みを知る」をご参照ください。

 ちなみに、これ以外に何通りものクラスローダ取得方法があります。用途などによって使い分ける必要があります。

PropertiesSample2クラスのソースコード
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PropertiesSample2 {
    public static void main(final String[] args) {
        final Properties prop = new Properties();
        InputStream inStream = null;
        try {
            inStream = PropertiesSample2.class.getClassLoader()
                .getResourceAsStream("sampleprop.properties");
            if (inStream == null) {
                throw new IllegalArgumentException(
                  "プロパティファイルの読み込みに失敗しました。");
            }
            prop.load(inStream);
            final String value = prop.getProperty("mykey");
            System.out.println(value);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inStream != null) {
                    inStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 このサンプルプログラムでは、クラスパスからプロパティファイルを読み込むような記述がされています。そのため、sampleprop.propertiesファイルはクラスパス上に配置する必要があります。

図5 クラスパスが通っている場所にプロパティファイルを配置する例(1) 図5 クラスパスが通っている場所にプロパティファイルを配置する例(1)

クラスパスが通っている場所にプロパティファイルを配置する

 ここでは、Eclipseのソースフォルダにプロパティファイルを配置することによりクラスパス上に配置されたことと同じ状況を作り出しています。これは、Eclipseのデフォルト状態の挙動なのです。

 さらに次ページでは、java.util.ResourceBundleクラスを使ったプロパティファイルの操作方法について見ていきましょう。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。