目次
プロパティファイルとは?
プロパティファイルとは、キーと値でプログラムで使用する設定値などを保存するためのファイルです。Javaアプリケーションの設定ファイルとして一般的に使われています。
設定が変わっても再コンパイル不要
プロパティファイルには、プログラムの既定値やデータベースの接続情報などの情報を保存します。このような情報は後から変更になったり、開発/本番などの環境によって内容が違ってくるため、プロパティファイルに記述しておくことで、後から変更が発生してもコンパイルなしでプログラムの動作を変えられます。
Javaのコードから設定を追い出す
次のJavaプログラムを見てください。ソースコードの中にデータベースのホスト名や認証情報が直接書かれています。このようなプログラムだと、データベースの接続先が変わるたびに、再コンパイルが必要となり、ソースの管理や運用面で非常に手間になります。
Connection connection = DriverManager.getConnection( "jdbc:postgresql://dev-database01:5432/dbname", "dev-user", "dev-password"); Statement statement = connection.createStatement();
データベースの情報をプロパティファイルから読み込むように、プログラムを書き換えたものが次の例です。
外部のファイルからデータベースの情報を読み込んでいるため、Javaのソースコード上から環境依存する情報が消えました。これにより、接続先が変わってもJavaの再コンパイルは不要になりました。
ResourceBundle rb = ResourceBundle.getBundle("sample"); Connection connection = DriverManager.getConnection( rb.getString("db"), rb.getString("user"), rb.getString("password")); Statement statement = connection.createStatement();
▪️ プロパティファイル(sample.properties)
#この行はコメントです。 db=jdbc:postgresql://dev-database01:5432/dbname user=dev-user password=dev-password
プロパティファイルの書き方
ここでは、プロパティファイルの基本的な書き方を紹介していきます。まずは、任意の場所に拡張子が「.properties」でプロパティファイルを作成してください。
設定を追加する
設定は「キー名=値」の形式で記述します。複数の設定を書く場合は、改行して書きます。
user=sample_user password=sample_pass
コメントの書き方
プロパティファイルには、任意のコメント行を追加することができます。コメントは「”#コメント」の形式で記述します。
#コメント user=sample_user
プロパティファイルをJavaから読み方法
作成したプロパティファイルを、Javaのプログラムから読み込む方法を解説します。
ResourceBundleクラス
java.utilパッケージの、ResourceBundleクラスを使ってプロパティファイルを読むことができます。getBundleメソッドの引数には、拡張子なしのファイル名を指定します。
ResourceBundleのインスタンスを作成したら、getStringメソッドにキー名を指定すると、指定したキーに対応した値が、戻り値として返ってきます。
import java.util.ResourceBundle; public static void main(String[] args) { ResourceBundle bundle = ResourceBundle.getBundle("sample"); String value = bundle.getString("user"); System.out.println(value); }
Propertiesクラス
もう一つの方法として、java.utilパッケージの、Propertiesクラスでもてプロパティファイルを読むことができます。Propertiesクラスを使用する場合は、ドライブのルートディレクトリからのフルパスでファイル名を指定する必要があります。
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public static void main(String[] args) throws IOException { Properties properties = new Properties(); String path = "/path/to/dir/sample.properties"; InputStream s = new FileInputStream(path); properties.load(s); String value = properties.getProperty("user"); }
Javaプログラムからプロパティファイルを書き込む
Javaのプログラムを使って、プロパティファイルに書き込むこともできます。次のサンプルコードのように、PropertiesクラスのsetPropertyメソッドを使用することで、値を書き込めます。最後にstoreメソッドを呼び出すことでファイルが保存されます。
import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; public static void main(String[] args) throws IOException { Properties properties = new Properties(); String path = "/path/to/dir/sample.properties"; properties.setProperty("sample_key", "書き込みテスト"); properties.store(new FileOutputStream(path), "Comments"); }
※同じキーが存在する場合は、値が上書きされます。
日本語のエスケープ
プロパティファイルは、デフォルトではファイルのエンコーディングが「ISO-8859-1」で保存されています。「ISO-8859-1」は基本的にアルファベットなどのASCII文字しか扱えず、日本語などのマルチバイト文字は扱えません。
マルチバイト文字を扱う場合は、次のように、日本語をUnicodeエスケープした形に変換し、ASCII文字で扱えるようにします。
例)「こんにちわ」をUnicodeエスケープした場合
\u3053\u3093\u3061\u306b\u306f
マルチバイト文字をUnicodeエスケープする方法について、以下に3つの方法を紹介します。
「native2ascii」を使用
1つ目に紹介する方法は、JavaのJDKに含まれる「native2ascii.exe」を使用する方法です。これを利用すると、日本語が書かれたプロパティファイルを、Unicodeエスケープしたファイルに変換できます。
使用方法は、まず日本語がそのまま書かれたプロパティファイルを用意します。今回のサンプルでは次のファイルを用意しました。
■ 変換前のファイル
message01=こんにちは message02=Java World
変換を行うには、コマンドプロンプトを起動し、次のコマンドを入力します。
native2ascii [変換対象のpropertiesファイル] [変換後のファイル名]
実際に「native2ascii.exe」を使ってコマンドを入力すると、[変換後のファイル名]で指定したファイルに、日本語をUnicodeエスケープしたものが出力されます。
▪️ 変換後のファイル
message01=\u3053\u3093\u306b\u3061\u306f message02=Java World
Eclipseプラグインを使用
Javaの開発では、Eclipseを使ってい人が多いと思います。Eclipseには沢山のプラグインがあり、プロパティファイルに関しても、便利なものがあります。
「PropertiesEditor」というプラグインは、日本語などのマルチバイト文字を、編集時は普通に日本語で入力でき、ファイル保存時に自動的にUnicodeエスケープしてくれる便利なプラグインです。
【関連記事】
▶EclipseとJavaで作れるもの。インストール~プログラム実行まで紹介
ブラウザを使ってUnicodeにエスケープ
上で紹介した2つの方法は、手元の環境にJavaの開発環境が必要になります。Javaの開発環境が作れない場合は、日本語の文字をUnicodeにエスケープしてくれるWEBサービスもあり、ブラウザにアクセスするだけで手軽に利用できます。
今回は「Unicodeエスケープシーケンス変換ツール」というサイトを紹介します。このサイトは次の画面イメージのように、画面左のテキストボックスに、変換したい日本語を入力すると、右側のテキストボックスにUnicodeエスケープした文字を表示してくれるWebツールです。
メッセージの国際化でもプロパティファイル
日本だけでなく、海外でも利用されるアプリケーションが場合、利用者の国と地域によって表示言語を切り替える国際化の対応が必要です。
国際化の対応は少し面倒で、例えば次のコードでは、Javaのソースコード上にメッセージの文字列が直接記述されているため、どの国と地域でも1つの言語でしか表示ができません。
System.out.println("こんにちは Java");
Javaには、地域(Locale)によって読み込むプロパティファイルを切り替える機能があり、これを利用して国際化の対応を行なっていきます。以降で、プロパティファイルを使って国際化に対応する方法を、解説します。
[STEP1] 対応する地域(Locale)の数だけファイルを準備
プロパティファイルで多言語に対応するには、まず同じキーを持つプロパティファイルを、対応する地域(Locale)の数だけ用意します。
今回のサンプルコードは、日本語と英語の2つの言語に対応していきます。最初に、英語と日本語で記述したプロパティファイルを2つ用意しましょう。
▪️ strings_en.properties (英語)
message=Hello Java
▪️ strings_ja.properties (日本語)
message=こんにちは Java
さらに、上記以外の地域の人のために、デフォルト言語のプロパティファイルも作成して、計3つのファイルを作成します。
▪️ strings.properties (デフォルト)
message=Default Java
[STEP2] Javaで地域(Locale)を指定して読み込み
プロパティファイルを作成したら、次のサンプルコードのように、地域(Locale)によって読み込むプロパティファイルを切り替える処理を作成します。
ResourceBundle jaBundle = ResourceBundle.getBundle("strings", Locale.JAPAN); String s = jaBundle.getString("message"); System.out.println("日本語=" + s); ResourceBundle enBundle = ResourceBundle.getBundle("strings", Locale.ENGLISH); s = enBundle.getString("message"); System.out.println("英語=" + s); ResourceBundle defaultBundle = ResourceBundle.getBundle("strings"); s = defaultBundle.getString("message"); System.out.println("デフォルト=" + s);
上のコードを実行すると、以下のような実行結果が表示されます。
日本語=こんにちは Java 英語=Hello Java デフォルト=Default Java
まとめ
プロパティファイル(拡張子が.propertiesのファイル)について、書き方の構文や、Javaのプログラムから読み書きする方法について、解説してきました。
Javaの開発では、プロパティファイルに設定値などを保存するのが一般的です。この機会にプロパティファイルの扱い方を覚えておきましょう。
ひと昔前までは、プロパティファイルは「ISO-8859-1」でエンコードされているのが一般的でしたが、Java7や8以降からは、「UTF-8」でプロパティを作成することも多くなってきました。