JavaGold資格取得に向けた勉強記第25回は「プロパティファイル」についてです。
Javaのプロパティファイルは、アプリケーションの設定情報やメッセージなどの静的なテキストデータを保存するための一般的な方法です。
プロパティファイルは、キーと値のペアの形式で情報を保持し、Javaの標準ライブラリを使用して簡単に読み書きすることができます。
この記事では、Javaのプロパティファイルについて詳しく説明します。
プロパティファイルとは
プロパティファイルは、キーと値のペアを使用して設定データを格納するための外部テキストファイルです。
Javaでは、主に.properties
という拡張子が使われます。これはアプリケーションの動作に関する設定や、ユーザーによって変更可能なデータなどを保存するのに便利です。
例えば、ソフトウェアの国際化に対応するとき、画面に表示する文字列やエラーメッセージなどは、ユーザが使う言語によって切り替えなければなりません。そのため、表示したい文字列やメッセージなどをプログラム中にリテラルとしてそのまま記述するのではなく、言語ごとに別のファイルを用意しておき、読み込むファイルをプログラムで変更して表示を切り替えるようにします。このファイルがプロパティファイルです。
プロパティファイルの構造
プロパティファイルは、「キー=値」または「キー:値」の書式で記述します。
# コメントは行頭に # を使います
# キー=値
key1=value1
key2=value2
# キー=値
key1:value1
key2:value2
プロパティファイルの読み込み
プロパティファイルをJavaのプログラムから読み込むには、次の手順でjava.util.Properties
クラスを使用します。
Propertiesオブジェクトの作成
Properties
クラスを使用してプロパティファイルを扱います。新しいProperties
オブジェクトを作成します。
Properties properties = new Properties();
ファイルの読み込み
FileInputStream
やFileReader
を使用して、プロパティファイルを読み込みます。Properties
クラスのload
メソッドを使用することで、ファイルからプロパティを読み込むことができます。
try (FileInputStream input = new FileInputStream("config.properties")) {
properties.load(input);
} catch (IOException e) {
e.printStackTrace();
}
上記の例では、config.properties
ファイルを読み込んでいます。このファイルは、アプリケーションの設定データを含んでいます。
プロパティへのアクセス
プロパティファイルから読み込んだ値は、Properties
オブジェクト内でキーを指定してアクセスできます。
このときには、get
メソッドやgetProperty
メソッドを使います。両者の違いは、get
メソッドの引数がObject型であるに対し、getProperty
メソッドはString型である点です。
String value1 = properties.getProperty("key1");
String value2 = properties.getProperty("key2");
プロパティファイルへの変換
Properties
クラスを使うと、プロパティファイルに記述した文字列は、文字コードがISO-8859-1として読み込まれます。プロパティファイルで日本語を扱いたい場合には、日本語からUnicord表記に変換するnative2asciiというJavaの標準ツールを使います。
例えば、日本語の値を含む次のようなプロパティファイルの場合、一旦テキストファイル(拡張子は.txt)として保存し、このツールでUnicode表記に変換します。
▼test.txt
hello = こんにちは
このテキストファイルをプロパティファイルに変換するために、native2asciiを使います。次のコマンドは、text.javaを読み込んで、日本語の文字列をUnicode表記に変換してからtest.propertiesとしてファイルに出力する例です。
native2ascii test.txt test.properties
今コマンドを実行すると、test.propertiesという名前のファイルが出力されます。
ResourceBundleクラス
プロパティファイルを扱うには、java.util.Properties
クラスのほかに、java.util.ResourceBundle
クラスを使う方法もあります。Properties
クラス との違いは、Local
を扱えること、デフォルトでUTF-8で記述されたプロパティファイルを扱えることです。
ResourceBundleの基本的な使い方
ResourceBundle
クラスは、主に以下のメソッドを使用してインスタンスを取得します。
▼プロパティファイル
# messages.properties
greeting.message=Hello, World!
// デフォルトのロケールを使用してResourceBundleを取得
ResourceBundle bundle = ResourceBundle.getBundle("messages");
String greetingMessage = bundle.getString("greeting.message");
System.out.println("Message: " + greetingMessage);
プロパティファイル(例: messages.properties
)は、キーと値のペアを持つテキストファイルで、ResourceBundle
クラスによって読み込まれます。
ResourceBundle
クラスは抽象クラスのため、newでインスタンスを生成することはできません。インスタンスを生成するには、staticメソッドのgetBundle
メソッドを使います。プロパティファイルを読み込む場合には、ResourceBundle
を継承したjava.util.PropertyResourceBundle
クラスのインスタンスが生成され、その参照が戻されます。
getBundle
メソッドの引数には、プロパティファイルのファイル名から拡張子を除いたものを指定します。この名前のことを「基底名」と呼びます。
プロパティファイルからキーを指定して値を取り出すには、getString
メソッドを使います。このメソッドは引数にキーとなる文字列を受け取り、値を文字列として戻します。
プロパティファイルを切り替える方法
ResourceBundle
クラスには、クライアントのロケール情報に合わせて読み込むプロパティファイルを自動的に切り替える機能が備わっています。
プロパティファイルを切り替えるには、同じ基底名の後ろに言語コードや国コードをアンダースコア「_」で繋いだ名前のプロパティファイルをロケールごとに用意します。例えば、日本であれば「sample_ja_JP.properties」となります。
ロケール情報に対応するプロパティファイルが存在しない場合、java.util.MissingResouceException
がスローされます。
任意のタイミングでロケール情報を切り替えるには、getBundle
メソッドの第2引数にロケール情報を渡します。
ResourceBundle jp = ResourceBundle.getBundle("messages", Local.JAPAN);
最後に
Javaのプロパティファイルは、アプリケーションの設定情報やメッセージなどの静的なテキストデータを保存するための便利な手段です。
プロパティファイルは、簡単に読み書きでき、国際化やローカライゼーションなどの多くの場面で活用されます。
Javaの標準ライブラリを使用して、プロパティファイルを効果的に操作することができます。