【Java入門】プロパティファイルの読み込み方法(Properties)

Javaにはプロパティファイルと呼ばれるファイルが存在します。この記事では、プロパティファイルについて、

プロパティファイルの用途は?
プロパティファイルの書き方を知りたい
プロパティファイルはどのように読み込むのか?

という基本的な疑問から、

  • ResourceBundleクラスを使用したプロパティファイルの読み込み方法
  • Propertiesクラスを使用したプロパティファイルの読み込み方法
  • プロパティファイルに書き込む方法
  • プロパティファイルを扱う際の注意点
  • xml形式のプロパティファイルへ読み書きする方法

などの応用的な使い方に関しても解説していきます。今回はそんなプロパティファイルについて、用途や作成方法、読み込み方法をわかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

プロパティファイルとは?

Javaには定数などの規定値や、プログラムから読み込むファイルのパスを記載したファイルを、プロパティファイルにまとめて記載しておくことが推奨されています。

もし、ソースファイルに規定値の値を記載していた場合、規定値に変更があったときにソースファイルを編集して再コンパイルし、動作確認といった手間が発生します。

しかし、規定値やパスなどの情報をソースコードではなく、プロパティファイルのような外部ファイルに記載しておくことで、内容に変更があった場合はファイルを編集するだけで済みます。

そのため、可能な限りプログラムで扱う情報は、プロパティファイルなどの外部ファイルに記載しておくことをオススメします。

設定ファイル、iniファイルとの違いは?

プログラミング言語のなかでもC++などは、拡張子を「.ini」とした設定ファイルを読み書きする関数が用意され、それを利用しています。

Javaの場合は、拡張子が「.properties」のプロパティファイルに定数などの規定値や、ファイルのパスなどをまとめて記載し、読み書きするのが一般的です。

プロパティファイルの書き方

プロパティファイルは、拡張子が「.properties」のファイルで「”キー名”=値」の形式で記述します。

以下に、プロパティファイルの基本的な書き方を紹介します。

—————————————————————
ファイル名:java.properties
# コメント
id=SAMURAI
pass=ENGINEER
ip=XXX.XX.XXXX
—————————————————————

プログラムでプロパティファイルを読み込むときは、プロパティファイルに記載している「キー名」を指定すれば、キーに紐づく値を取得することができます。

プロパティファイルを読み込む方法

プロパティファイルを読み込む方法はいくつかありますが、ここでは基本的な読み込み方法を2つ紹介します。

java.util.ResourceBundleクラスを使用する方法

プロパティファイルは、ResourceBundleクラスを使用して読み込むことができます。ファイルを読み込むにはResourceBundleクラスのgetBundleメソッドを使用し、引数に拡張子無しでファイル名のみを指定します。

ResourceBundle.getBundle(“ファイル名”);

また、ResourceBundleクラスは「java.util.ResourceBundle」をインポートする必要があります。以下にResourceBundleクラスを使用した、プロパティファイルを読み込む方法を記述します。

import java.util.ResourceBundle;

public class Main {
 
    public static void main(String[] args) {
        ResourceBundle rb = ResourceBundle.getBundle("java");
        
        System.out.println(rb.getString("id"));
        System.out.println(rb.getString("pass"));
    }

}

実行結果:

SAMURAI
ENGINEER

プロパティファイルは、上述したプロパティファイルの作成で説明した、ファイルの内容をそのまま使用しています。ファイルは基本的にjavaプログラムの実行ディレクトリと同じ位置に置きます。

サンプルでは、ResourceBundleクラスのgetBundleメソッドを使用し、引数に拡張子無しでファイル名を指定しています。値の取得は、ResourceBundleクラスのgetStringメソッドの引数にキー名を指定すれば、キー名に紐づく値を取得できます。

また、ResourceBundleクラスはファイルをパス/ファイル名のように、絶対パス指定はできません。

java.util.Propertiesクラスを使用する方法

プロパティファイルを任意の場所に置きたい場合は、Propertiesクラスを使用する方法もあります。ファイルを読み込むにはPropertiesクラスのloadメソッドを使用し、引数にプロパティファイルに関連付けられたInputStreamクラスを指定します。

Properties.load(InputStream);

また、Propertiesクラスは「java.util.Properties」をインポートする必要があります。以下にPropertiesクラスを使用した、プロパティファイルを読み込む方法を記述します。

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.Properties;

public class Main {
 
    public static void main(String[] args) {
        Properties properties = new Properties();
        
        //プロパティファイルのパスを指定する
        String strpass = "/Users/Shared/java/properties/java.properties";
        
        try {
            InputStream istream = new FileInputStream(strpass);
            properties.load(istream);
            System.out.println(properties.getProperty("id"));
            System.out.println(properties.getProperty("pass"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

}

実行結果:

SAMURAI
ENGINEER

サンプルでは、プロパティファイルを任意の位置に置いて、パスをStringで指定しています。FileInputStreamクラスを拡張したInputStreamクラスでパスを指定し、Propertiesクラスのloadメソッドでプロパティファイルを読み込みます。

値はPropertiesクラスのgetPropertyメソッドで引数にキー名を指定すれば、キー名に紐づく値を取得できます。

Mapや配列に格納する方法

プロパティファイルから読み込んだ値をオブジェクト変数に格納して使いやすいようにしておきましょう。以下のサンプルコードではMap型のオブジェクトや配列に格納する方法について、ご紹介しています。

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
import java.util.Properties;

public class Main {
 
    public static void main(String[] args) {
        Properties properties = new Properties();
        
        //プロパティファイルのパスを指定する
        String strpass = "/Users/Shared/java/properties/java.properties";
        
        try {
            InputStream istream = new FileInputStream(strpass);
            properties.load(istream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // Mapに格納
        Map<String, String> propMap = new HashMap<>();
        for(Map.Entry<Object, Object> e : properties.entrySet()) {
            propMap.put(e.getKey().toString(), e.getValue().toString());
        }
        
        // 配列に格納
        String str = properties.getProperty("ip");
        String[] arr = str.split("."); // ピリオドで分割
        
        System.out.println(propMap);
        System.out.println(Arrays.asList(arr));
    }

}

実行結果:

{pass=ENGINEER, ip=XXX.XX.XXXX, id=SAMURAI}
[XXX, XX, XXXX]

プロパティファイルに書き込む方法

プロパティファイルに書き込むには、setPropertyメソッドを使います。setPropertyメソッドで同じキーを指定した場合、値は上書きされます。また、書き込み後にファイルを保存するには、storeメソッドを使います。

サンプルコードで確認しましょう。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class Main {
 
    public static void main(String[] args) {
        Properties properties = new Properties();
        
        // プロパティファイルのパスを指定する
        String strpass = "java.properties";
        
        try {
            // 書き込み
            properties.setProperty("id", "SAMURAI2");
            properties.setProperty("pass", "ENGINEER2");
            properties.store(new FileOutputStream(strpass), "Comments");
            
            // 読み込み
            InputStream istream = new FileInputStream(strpass);
            properties.load(istream);
            istream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // Mapに格納
        Map<String, String> propMap = new HashMap<>();
        for(Map.Entry<Object, Object> e : properties.entrySet()) {
            propMap.put(e.getKey().toString(), e.getValue().toString());
        }
        
        System.out.println(propMap);
    }

}

実行結果:

{pass=ENGINEER2, id=SAMURAI2}

プロパティファイルを扱う際の注意点

文字コードについて

プロパティファイルでは、デフォルトでISO-8859-1としてエンコードされます。したがって、日本語などは文字化けします。

日本語を扱うようにするために、以前はnative2asciiコマンドを利用してASCIIコードの文字のみで表現できるユニコードエスケープ表現に変換する必要がありました。

しかし、Java8などでは文字コードを指定して読み書きすることができます。詳しい内容については次節で解説します。

日本語の扱い方について

プロパティファイルで日本語を読み書きする場合は、UTF-8を指定したInputStreamReaderオブジェクトやOutputStreamWriterオブジェクトを利用すれば、大丈夫です。サンプルコードで確認しましょう。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class Main {
 
    public static void main(String[] args) {
        Properties properties = new Properties();
        
        // プロパティファイルのパスを指定する
        String strpass = "java.properties";
        
        try {
            // 書き込み
            properties.setProperty("id", "侍");
            properties.setProperty("pass", "エンジニア");
            OutputStream ostream = new FileOutputStream(strpass);
            OutputStreamWriter osw = new OutputStreamWriter(ostream, "UTF-8");
            properties.store(osw, "Comments");
            
            // 読み込み
            InputStream istream = new FileInputStream(strpass);
            InputStreamReader isr = new InputStreamReader(istream, "UTF-8");
            properties.load(isr);
            istream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // Mapに格納
        Map<String, String> propMap = new HashMap<>();
        for(Map.Entry<Object, Object> e : properties.entrySet()) {
            propMap.put(e.getKey().toString(), e.getValue().toString());
        }
        
        System.out.println(propMap);
    }

}

実行結果:

{pass=エンジニア, id=侍}

コメントの書き方について

プロパティファイルでは、行頭が「#」もしくは「!」で始まる行は、コメントとして扱われます。コメントを記入して、読みやすいプロパティファイルにするようにしましょう。

xml形式のプロパティファイルに読み書き

Java5からxml形式でもプロパティファイルを記述できるようにメソッドが追加されました。xml形式のプロパティファイルを読み込むには以下のように記述します。

loadFromXML(InputStream)

xml形式のプロパティファイルに書き込むには以下のように記述します。

storeToXML(OutputStream)

xml形式は、文字コードの影響を受けにくいというメリットがあります。

サンプルコードで確認しましょう。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class Main {
 
    public static void main(String[] args) {
        Properties properties = new Properties();
        
        // プロパティファイルのパスを指定する
        String strpass = "prop.xml";
        
        try {
            // 書き込み
            properties.setProperty("id", "侍");
            properties.setProperty("pass", "エンジニア");
            OutputStream ostream = new FileOutputStream(strpass);
            properties.storeToXML(ostream, "コメント");
            
            // 読み込み
            InputStream istream = new FileInputStream(strpass);
            properties.loadFromXML(istream);
            istream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // Mapに格納
        Map<String, String> propMap = new HashMap<>();
        for(Map.Entry<Object, Object> e : properties.entrySet()) {
            propMap.put(e.getKey().toString(), e.getValue().toString());
        }
        
        System.out.println(propMap);
    }

}

実行結果:

{pass=エンジニア, id=侍}

ファイルの読み込み方法について知りたい方へ

ファイルのさまざまな読み込み方法については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

まとめ

ここではプロパティファイルについて、用途やファイルの書き方、読み込み方法などについて説明しました。システムの規模が大きくなるにつれて、プロパティファイルやiniファイルといった外部ファイルに、規定値などの必要な情報を大量に記載する機会が多くなると思います。

もしプロパティファイルのことを忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
ntakeshi@sejuku.net

目次