前々から気になってて仕方の無かった疑問の一つ。
Propertyファイル・・・広く言えば外部リソースという言い方になるらしいんだけど。
例えばクラスパス直下の*.propertiesファイルであれば、ResourceBundleで一発で読み出せる。ResourceBundleは基本的にローカライズリソースの読み込みに使われるので、まあ、便利。
ただ、ResourceBundleはプロパティファイルの位置を指定できない。クラスパスツリーの中に組み込まれた形でないと利用できない(元々リソースを表現するクラスファイルを読み込むものらしいので、当然と言えば当然)。
というわけで、好き勝手な位置のiniファイルやpropertiesファイルをどうやって読み込ませようか、となるわけだけど、Log4jの初期化部分とか眺めて大雑把に3種類くらいありそう。
1. ClassLoaderのgetResource()をそのまま利用する。→これだとやっぱりクラスパスツリーの内部にしかおけない・・・。
2. URLクラスの形で指定し、Properties#load()に、URL#openStream()を指定する。
3. 普通にjava.io.FileInputStream()を作成し、Properties#load()に指定する。
1. はクラスパスツリー限定になるので不可。なんだってこう、Javaのリソースの取り扱いってクラスパス主義なのかね。Perl/Ruby/PHP/Pythonの方が融通が利く。そういうところは。
2. については、結局のところファイル指定の部分がURL経由か、手動でFileInputStreamを作るか、ってところだけで、結局は同じ。そうすると、URL経由だと
file:///c:/hogehoge/bohebohe/hoge.properties
みたいにやたら冗長に指定することになる。めんどくせー。
・・・まあ、DOSから動かすのであれば
file:///%CD%/../../hoge.properties
とか指定できるからあながち困るわけでも無いんだけど。
結局のところ、URL経由か直かの違いだけで、クラスパスツリーの外に設定ファイルを置こうとしたらProperties#load()を使用するほか無いのかもしれない。
コメント