13

クラスパス上のファイルの名前を実際のファイル名に変換するにはどうすればよいですか?

たとえば、ディレクトリ"C:\workspace\project\target\classes"がクラスパス上にあるとします。そのディレクトリ内には、などのファイルがありますinfo.properties

文字列のみを指定して、(実行時に)info.propertiesファイルへの絶対ファイルパスをどのように決定します"info.properties"か?

結果は次のようになります"C:\workspace\project\target\classes\info.properties"

なぜこれが便利なのですか?単体テストを作成するときは、テストリソース(src/main/resources)にバンドルされているファイルにアクセスしたいが、相対的なクラスパス参照ではなく、実際のファイル名を必要とするサードパーティのライブラリまたはその他のシステムを使用している場合があります。

注:この質問は便利なトリックだと思うので、自分で回答しましたが、これまで誰もこの質問をしたことがないようです。

4

1 に答える 1

18

ClassLoader.getResource()とURL.getFile()の組み合わせを使用します

URL url = Thread.currentThread().getContextClassLoader().getResource( resource );
if( url == null ){
    throw new RuntimeException( "Cannot find resource on classpath: '" + resource + "'" );
}
String file = url.getFile();

Windowsに関する注意:上記の例では、実際の結果は次のようになります。

"/C:/workspace/project/target/classes/info.properties"

よりWindowsに似たパス(つまり)が必要な場合は、次"C:\workspace\..."を使用します。

String nativeFilename = new File(file).getPath();
于 2013-01-04T17:43:11.727 に答える