【Java】Propertiesクラスを利用した設定データの保存

2018年8月28日

本稿は、セーブデータをキー、値ペアとして保存する方法を紹介します。

Propertiesクラスとは、[キー]=[値]で保持するテキストファイルを読み書きするためのクラスです。

アプリケーション設定ファイルとして使われることが多いです。

人間がわかりやすいデータのため、設定ファイルを容易に改変できることがメリットです。

逆に改変できなくしたい場合は、このクラスを利用すべきではありません。

ゲームで手軽に設定ファイルを利用したり、ユーザーがキャラのステータスを自由に設定できるようにしたい場合に利用するのも一つの手です。

設定データの書き出し

実際に設定データを書き出してみましょう。

設定データはフルスクリーンモードの有効無効と音声の有効無効のみの設定をしたい場合を想定してみます。

propクラスはHashMapと同じようにキー、値として値を設定できます。

setPropertyメソッドで値を設定し、storeメソッドでファイル化できます。

それではサンプルです。

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class Test {
	public static void main(String[] args) {
		try(FileOutputStream f = new FileOutputStream("conf.txt");
			BufferedOutputStream b = new BufferedOutputStream(f)){

			Properties prop = new Properties();
			prop.setProperty("fullscreen", "on");
			prop.setProperty("sound", "off");
			prop.store(b, "onが有効でoffが無効です。");
		} catch ( IOException e ) {
			e.printStackTrace();
		}
	}
}
実行結果

ありゃりゃ、なんか日本語の部分が\u304Cとかの文字列になってしまいました。

日本語は自動でユニコード形式に変換されてしまうんですね。

eclipseを利用している方はlimyプロパティエディタなどを利用すると日本語で見ることができます。

日本語で直接テキストを記述すると今度は読み込むときにわけのわからない文字になってしまうので、気を付けましょう。

テキストに
fullscreen=on
sound=off
が書き出されていたのでOKでしょう。

ちなみに#から始まる行はコメントアウト扱いになるので、設定データとして扱われません。

2018/08/03・・・PropertiesにはReaderやWriterを引数にすることもできます。こちらを利用して文字コードを指定すれば、日本語の表示も可能です。

設定データの読み込み

設定ファイルの読み取りはloadメソッドで実行し、データの取得はgetPropertyメソッドで取得できます。

先ほど作成した設定データを読み込んで、フルスクリーンの有効無効と音声の有効無効を読み取りましょう。

内容をもう一度確認しておきます。

conf.txt

それではサンプルを実行してみましょう。

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

public class Test {
	public static void main(String[] args) {
		try(FileInputStream fis = new FileInputStream("conf.txt");
			BufferedInputStream bis = new BufferedInputStream(fis)){

			Properties prop = new Properties();
			prop.load(bis);

			if ( "on".equals(prop.getProperty("fullscreen")) ) {
				System.out.println("フルスクリーンは有効です。");
			} else {
				System.out.println("フルスクリーンは無効です。");
			}

			if ( "on".equals(prop.getProperty("sound")) ) {
				System.out.println("音声は有効です。");
			} else {
				System.out.println("音声は無効です。");
			}
		} catch ( IOException e ) {
			e.printStackTrace();
		}
	}
}
実行結果

フルスクリーンは有効です。
音声は無効です。

うまく設定データを読み込めているようですね。

Java

Posted by nompor