Java:java.net.URL#getFile()は使い物にならない

実行中クラスのクラスパスもしくはjarファイルの取得のClassPathLocatorを使っていたのだが、不具合に気がついた(既に修正済)。

状況

空白や漢字混じりのパスにjarファイルを置いておくと。URLが以下のようなものになってしまう。

jar:file:/C:/Users/admin/Desktop/foobar%20%e3%82%b3%e3%83%94%e3%83%bc/sample.jar!/com/cm55/sample/ClassPathLocator.class

file部分のURLは、

file:/C:/Users/admin/Desktop/foobar%20%e3%82%b3%e3%83%94%e3%83%bc/sample.jar

結局、jarファイルのパスは、

C:\Users\admin\Desktop\foobar%20%e3%82%b3%e3%83%94%e3%83%bc\sample.jar

のようなものになってしまう。本来は以下にならなければいけない。

C:\Users\admin\Desktop\foobar コピー\sample.jar

解決

あるURLがあったとき、正しくPathを得るには以下のようにすれば良いようだ(Java7以降)。

Path path = Paths.get(url.toURI());

Fileを取得するには、

File file = path.toFile();

参考