home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

日記/2006/11/02/JavaでPropertyファイルを好き勝手な位置から読み込ませるには

作成日: 2006-11-02 10:37:17   /   last updated at: 2009-04-05 10:38:44
カテゴリ: Java 

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

original url: https://www.glamenv-septzen.net/view/295