【JavaGold勉強記#25】プロパティファイル編

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();

ファイルの読み込み

FileInputStreamFileReaderを使用して、プロパティファイルを読み込みます。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の標準ライブラリを使用して、プロパティファイルを効果的に操作することができます。