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ファイルの位置ってどうやって取得するんだろう……」と、
うんうん試行錯誤していた自分に教えてあげたいです。マジで。
とまあ、こんな感じでした。便利!