その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

getResourceが便利。今まで知らなかったのが悔やまれる。

お疲れ様です。いかがお過ごしでしょうか。


はい。Javaです。
JavaのClassLoaderクラスでサポートされているgetResource()便利で逆に凹みました。
皆さんご存知かとは思いますが、便利だったので備忘録として……

getResource() ?

JavaTM 2 Platform Standard Edition 5.0 API 仕様によると

指定された名前を持つリソースを見つけます。リソースは、コード位置に依存しない方法でクラスコードによってアクセスできる、
何らかのデータ (イメージ、オーディオ、テキストなど) です。

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/ClassLoader.html#getResource%28java.lang.String%29

とあります。


例えば、

class Foo{
    public static void main( String[] args ){
        String fooPath = Foo.class.getResource( "Foo.class" ).toString;
	System.out.println( fooPath );
    }
}

こんな風に書くと、mainメソッドによって実行中である自クラスFooの位置を教えてくれる訳ですね。便利です。

出力の違い(Windows的ファイルシステムの場合)

上記の例をまた使用します。ドキュメントにもあるように、getResource()の戻り値はURLです。


クラスFooが記述されているソースコード(Foo.java)が通常のディレクトリに存在する場合、出力は

file:/C:/foo/bar/Foo.class

となります。


このクラスFooがjarファイル内(jarのルート)に存在する場合、出力は

jar:file:/C:/foo/bar/baz.jar!/Foo.class

となります。
また、jarファイル内にディレクトリ階層が出来ている場合
(例えば、クラスファイルは全部"class"ディレクトリに入れる、というルールが適用されている場合)

jar:file:/C:/foo/bar/baz.jar!/class/Foo.class

という感じで、jarファイルの場合"!/"以降にjar内のディレクトリ階層も出力してくれます。

利用

あとはスプリット('/'や'!'なんかで)を使って必要な部分だけを取り出すなり、
正規表現を用いて料理するなり、色々と可能です。


あと、上記の例ではWindowsを用いていますが、Javaマルチプラットフォームなので、もちろんUnix/Linuxでも利用できます。
さすがJava! そこにシビれる!あこがれるゥ!
(但し、getResource()で取得してきた後の処理は、そのOS環境に応じた書き方をする必要があると思いますが)


数年前、「実行中のjarファイルの位置ってどうやって取得するんだろう……」と、
うんうん試行錯誤していた自分に教えてあげたいです。マジで。


とまあ、こんな感じでした。便利!