.propertiesファイルは、Javaアプリケーションの設定パラメータや国際化・地域化のための文字列を格納するために一般的に使用されるファイル形式です。これらのファイルは、キーと値のペアの形式でデータを保持します。
Propertiesクラスの基本操作
java.util.PropertiesクラスはHashtableのサブクラスであり、Mapインターフェースの特性を持ちます。このクラスは、キーと値のペアを格納し、それらがすべて文字列型であるという特徴があります。IO操作と連携して設定ファイルなどを扱う際に非常に便利です。
メモリ上でのProperties操作
ファイルに依存せず、Propertiesオブジェクト内で直接キーと値の操作を行う例を以下に示します。
package bxd;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
public class PropertiesMemExample {
public static void basicOperations() {
Properties config = new Properties();
// 要素の設定
config.setProperty("user", "admin");
config.setProperty("timeout", "3000");
System.out.println("Initial properties: " + config);
// 要素の取得
System.out.println("Get 'user': " + config.getProperty("user"));
System.out.println("Get 'timeout': " + config.getProperty("timeout"));
// 要素の更新
config.setProperty("timeout", "5000");
// 全てのキーを取得して表示
Set<String> keys = config.stringPropertyNames();
System.out.println("Updated properties:");
for (String key : keys) {
System.out.println(key + ": " + config.getProperty(key));
}
}
public static void main(String[] args) throws IOException {
basicOperations();
}
}
Propertiesクラスと設定ファイルの連携
Propertiesクラスは、ファイルからのデータの読み込み(ロード)とファイルへのデータの書き出し(ストア)が可能です。これにより、アプリケーションの設定を外部ファイルで管理できます。
設定ファイルからの読み込み (load)
指定したファイルからキーと値のペアを読み込み、Propertiesオブジェクトに格納します。
package bxd;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class PropertiesFileLoadExample {
public static void loadFromFile(String filePath) throws IOException {
Properties config = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
// ファイルからPropertiesをロード
config.load(fis);
System.out.println("Loaded properties:");
// デバッグ用に内容を標準出力にリスト表示
config.list(System.out);
} finally {
if (fis != null) {
fis.close();
}
}
}
public static void main(String[] args) throws IOException {
// messages.properties というファイルから読み込む例
// 事前に messages.properties ファイルを作成し、キー=値 の形式で記述しておく必要があります。
// 例:
// app.name=My Application
// db.url=jdbc:mysql://localhost:3306/mydb
loadFromFile("messages.properties");
}
}
設定ファイルへの書き出し (store)
Propertiesオブジェクトの内容を指定したファイルにキーと値のペアとして保存します。
package bxd;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class PropertiesFileStoreExample {
public static void storeToFile(String filePath) throws IOException {
Properties config = new Properties();
FileOutputStream fos = null;
try {
config.setProperty("api.key", "your_secret_key");
config.setProperty("log.level", "INFO");
fos = new FileOutputStream(filePath);
// ファイルにPropertiesをストア
config.store(fos, "Configuration settings for the application");
System.out.println("Properties stored to " + filePath);
} finally {
if (fos != null) {
fos.close();
}
}
}
public static void main(String[] args) throws IOException {
// info.txt というファイルに書き出す例
storeToFile("info.txt");
}
}
Propertiesクラスを利用した簡単な練習
この例では、アプリケーションの起動回数を制限するためにPropertiesファイルを使用します。ファイルが存在しない場合は新規作成し、起動回数を記録・更新します。指定回数を超えた場合は、それ以上の実行を許可しません。
package bxd;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class PropertiesUsageLimitExample {
private static final String CONFIG_FILE = "app_usage.properties";
private static final int MAX_USAGE_COUNT = 5;
public static void main(String[] args) throws IOException {
Properties usageConfig = new Properties();
File configFile = new File(CONFIG_FILE);
// 設定ファイルが存在しない場合は新規作成
if (!configFile.exists()) {
configFile.createNewFile();
}
// ファイルから現在の使用回数を読み込む
FileInputStream fis = null;
try {
fis = new FileInputStream(configFile);
usageConfig.load(fis);
} finally {
if (fis != null) {
fis.close();
}
}
// 現在の使用回数を取得し、数値に変換
int currentUsageCount = 0;
String countStr = usageConfig.getProperty("usage.count");
if (countStr != null) {
try {
currentUsageCount = Integer.parseInt(countStr);
} catch (NumberFormatException e) {
System.err.println("Error parsing usage count from config file. Resetting count.");
currentUsageCount = 0; // 数値形式でない場合はリセット
}
}
// 使用回数が上限に達しているかチェック
if (currentUsageCount >= MAX_USAGE_COUNT) {
System.out.println("Sorry, the maximum usage limit (" + MAX_USAGE_COUNT + ") has been reached.");
return; // 実行を中止
}
// 使用回数をインクリメント
currentUsageCount++;
// 更新された使用回数をPropertiesに設定
usageConfig.setProperty("usage.count", String.valueOf(currentUsageCount));
// 更新した設定をファイルに保存
FileOutputStream fos = null;
try {
fos = new FileOutputStream(configFile);
usageConfig.store(fos, "Application usage count");
System.out.println("Application launched. Usage count: " + currentUsageCount + "/" + MAX_USAGE_COUNT);
} finally {
if (fos != null) {
fos.close();
}
}
}
}