前々から気になってて仕方の無かった疑問の一つ。 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()を使用するほか無いのかもしれない。