Java言語からプロパティファイルを扱う1つ目のAPIは、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();
}
}
}
} |
|
この個所で、Propertiesクラスがプロパティファイルの内容を読み込みます。
final String value = prop.getProperty("mykey"); |
|
この個所で、mykey というキーに対応した値を取り出します。
この記事で挙げるサンプルプログラムは、現実的なプログラムで必要となる粒度の例外処理を実装していません。これは、現実的な例外処理を実装すると、APIの見通しが悪くなってしまうためです。現実的なプログラムで必要となる例外処理の粒度については、以前の記事を参考にしてください。
このサンプルプログラムでは、カレントディレクトリからプロパティファイルを読み込むよう記述されています。そのため、sampleprop.propertiesファイルはプログラム実行環境にとってカレントディレクトリに配置してください。
図3 プロパティファイルをカレントディレクトリに配置する例
sampleprop.propertiesファイルの中身 |
|
なお参考までに、いくつかの正常系ではない動作についてお伝えします。対象となるプロパティファイルが読み込めなかった場合には、下記のような例外が発生します。
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 クラスローダを用いたプロパティファイルの読み込み
ポイントは、クラスローダを利用してプロパティファイルを取得するように変更されている点です。この例では このクラス自身を読み込む際に利用されたクラスローダを用いてプロパティファイルを探すようにしています。
inStream = PropertiesSample2.class.getClassLoader()
.getResourceAsStream("sampleprop.properties"); |
|
Javaのクラスローダに関する話題は、やや難易度の高いものの1つです。初心者の方は分からなくても気にせず読み飛ばして先に進んでください。
ちなみに、これ以外に何通りものクラスローダ取得方法があります。用途などによって使い分ける必要があります。
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)
ここでは、Eclipseのソースフォルダにプロパティファイルを配置することによりクラスパス上に配置されたことと同じ状況を作り出しています。これは、Eclipseのデフォルト状態の挙動なのです。
さらに次ページでは、java.util.ResourceBundleクラスを使ったプロパティファイルの操作方法について見ていきましょう。