こんな疑問に答えます!
考え方
プロパティファイルはキー=値
の組で情報を保持するファイルです。
実は、この考え方が落とし穴だったのです。
値を書く場所だからといって値を書く必要はないんです。別のキーを値として持たせれば良かったんです。
ということでサンプルコードを見てみましょう。
サンプルコード
以下のプロパティファイルは、KEY1
、KEY2
、KEY3
に国の名前を持たせ、
そのキー(KEY1
、KEY2
、KEY3
)を:
で連結してMASTER_KEY
の値として持たせています。
test.properties
MASTER_KEY=KEY1:KEY2:KEY3
KEY1=Japan
KEY2=America
KEY3=China
上記のプロパティファイルから値を取得するJavaの実装が以下です。
Java
package com.example;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class App {
public static void main( String[] args ){
Properties properties = new Properties();
InputStream inStream = null;
//プロパティファイルが格納されているパス
String path = "\\c:\\workspace\\test.properties";
try {
inStream = new FileInputStream(path);
//プロパティファイルを読み込む
properties.load(inStream);
//「MASTER_KEY」に紐づく値を取得。
String masterValue = properties.getProperty("MASTER_KEY");
//「:」でスプリット
String[] keys = masterValue.split(":");
//スプリットしたKeyの数だけループ
for (String key : keys){
//keyを基にプロパティファイルから値を取得。
String value = properties.getProperty(key);
//値を出力。
System.out.println(value);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
実行結果は以下のとおりになります。
実行結果
Japan
America
China
解説
プロパティファイルには、MASTER_KEY
というキーがあり、その値がKEY1:KEY2:KEY3
になっています。
これをJava側で:
でスプリットします。
その結果KEY1
、KEY2
、KEY3
に分割されます。
Java側でこの文字列をキーとして再度プロパティファイルにアクセスします。
こうすることでKEY1
、KEY2
、KEY3
に対応したJapan
、America
、China
が取得できるという仕組みです。
キーを増やしたくなったら
このプロパティファイルにキーを増やしたくなったとしましょう。
例えば、フランスの情報を追加したくなったら以下のようにtest.properties
を修正します。
test.properties
MASTER_KEY=KEY1:KEY2:KEY3:KEY4
KEY1=Japan
KEY2=America
KEY3=China
KEY4=France
まず、フランスの情報としてKEY4=France
を定義します。
次に、キーであるKEY4
をMASTER_KEY
側にも追記してMASTER_KEY=KEY1:KEY2:KEY3:KEY4
とします。
こうすることで、Java側のコード修正を伴わずに、プロパティファイルの情報を追加するだけで「フランス」に対応したアプリ改修が完了します。
以下は実行結果です。
実行結果
Japan
America
China
France
【応用】プロパティキーから取得した値に応じて処理を分岐する
プロパティキーから取得した値に応じて処理分岐するには、キーを判定して分岐するのがオススメです。
以下のプロパティファイルでは、家の情報と車の情報を保持しています。
test.properties
MASTER_KEY=HOME:CAR
HOME=home1:home2:home3
CAR=car1:car2:car3
home1=tokyo
home2=california
home3=paris
car1:toyota
car2:tesla
car3:volkswagen
Java側の実装は以下のとおりです。以下の処理ではstartWith
でキーの始まりが何であるかを判定して処理分岐を行っています。
Java
package com.example;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class App {
public static void main( String[] args ){
Properties properties = new Properties();
InputStream inStream = null;
//プロパティファイルが格納されているパス
String path = "\\c:\\workspace\\test.properties";
try {
inStream = new FileInputStream(path);
//プロパティファイルを読み込む
properties.load(inStream);
//「MASTER_KEY」に紐づく値を取得。
String masterValue = properties.getProperty("MASTER_KEY");
//「:」でスプリット
String[] masterValueArray = masterValue.split(":");
//スプリットした数だけループ
for (String CategoryKey : masterValueArray){
//keyを基にプロパティファイルから値を取得。
String categoryValue = properties.getProperty(CategoryKey);
//「:」でスプリット
String[] keys = categoryValue.split(":");
//スプリットした数だけループ
for (String key : keys){
//keyを基にプロパティファイルから値を取得。
String value = properties.getProperty(key);
//keyが「home」から始まる場合
if (key.startsWith("home")){
System.out.println("私は" + value + "に住んでいます。");
//keyが「car」から始まる場合
}else if(key.startsWith("car")){
System.out.println("私は" + value + "を持っています。");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
実行結果は以下のとおりです。
実行結果
私はtokyoに住んでいます。
私はcaliforniaに住んでいます。
私はparisに住んでいます。
私はtoyotaを持っています。
私はteslaを持っています。
私はvolkswagenを持っています。
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!