書く度に忘れてしまうので、まとめてメモ。
Test1.java:
import java.io.*; import java.util.*; public class Test1 { public static void main(String args[]) { if (1 > args.length) { System.err.println("args : *.properties"); return; } Properties prop = new Properties(); try { prop.load(new FileInputStream(new File(args[0]))); } catch (IOException e) { e.printStackTrace(); return; } for (Map.Entry<Object, Object> e : prop.entrySet()) { System.out.println(e.getKey() + "=" + e.getValue()); } } }
foo.ini
## java property file a.b.c=123 #comment foo=aaaaaaaaaaaaaaaaaaaaaaaa
実行:
> java Test1 foo.ini a.b.c=123 foo=aaaaaaaaaaaaaaaaaaaaaaaa
java.util.Propertiesは Map<Object,Object> interfaceを実装してるので、アプリ中ではinterfaceで受けて使い回してもOK。
参考:
ただのResourceBundleだけだと、リソースバンドルをクラスで作ったり面倒くさい。
メッセージの国際化なら文字列しか扱わないので、PropertyResourceBundleでpropertiesファイルを使って済ませることが出来る。
pack/age/Test1.java:
package pack.age; import java.util.*; public class Test1 { public static void main(String args[]) { Locale currentLocale = Locale.getDefault(); System.out.println(currentLocale); ResourceBundle res = PropertyResourceBundle.getBundle( "pack.age.restest"); System.out.println(res.getString("foo")); System.out.println(res.getString("bar")); } }
pack/age/restest.properties:
foo=English bar=Version
pack/age/restest_cp932.properties:
foo=日本語 bar=バージョン
UNICODEに変換:
native2ascii pack\age\restest_cp932.properties pack\age\restest_ja.properties
日本語ロケールで実行:
> java -cp . pack.age.Test1 ja_JP 日本語 バージョン
英語ロケールで実行1:
> java -Duser.language=en -cp . pack.age.Test1 en_JP English Version
国がJPなのに言語がenって、何か不思議ですね。
英語ロケールで実行2:
> java -Duser.language=en -Duser.region=us -cp . pack.age.Test1 en_US English Version
参考: