web-dev-qa-db-ja.com

プロジェクトの/ resourcesフォルダーにあるファイルへの絶対パスを取得する方法

標準のMavenセットアップを想定しています。

リソースフォルダーにabcというファイルがあるとします。

Javaでは、どのようにしてファイルへの絶対パスを取得できますか?

67
JAM

ClassLoader.getResourceメソッドを使用して、正しいリソースを取得できます。

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

OR

これは常に機能するとは限りませんが、より簡単な解決策-

Fileオブジェクトを作成し、getAbsolutePathメソッドを使用できます。

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
33
Rahul Bobhate

実際に機能する適切な方法:

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

クラスパス内のファイルが物理的にどこにあるかは問題ではありません。リソースが実際にファイルであり、JARエントリではない場合は見つかります。

(一見明らかなnew File(resource.getPath())はすべてのパスで機​​能するわけではありません!パスはまだURLエンコードされています!)

141
Karol S

/から始まるパスを指定する必要があります

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();
19
Hett

必要なクラスのclassLoaderインスタンスを作成すると、ファイルまたはリソースに簡単にアクセスできます。ここで、そのクラスのgetPath()メソッドを使用してパスにアクセスします。

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);
10
Kirit Thakrar

絶対パスに向かう途中で2つの問題があります。

  1. 見つかった配置は、ソースファイルが存在する場所ではなく、クラスが保存される場所です。そして、リソースフォルダーはほぼ確実にプロジェクトのソースフォルダーのどこかにあります。
  2. クラスがプラグインまたはワークスペース内のパッケージで直接実行される場合、リソースを取得するための同じ関数の動作は異なります。

次のコードは、すべての有用なパスを提供します。

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

ここでは、リソースフォルダのローカライズに使用できる両方の機能が調査されています。 classについては、静的または動的に取得できます。


プロジェクトがプラグインに含まれていない場合、JUnitで実行された場合のコードは次を出力します。

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

したがって、src/rest/resourcesにアクセスするには、ファイルツリーを上下に移動する必要があります。両方の方法を使用できます。そのフォルダーはターゲットフォルダーにないため、getResource(resourceFolderName)は使用できません。作成されたフォルダにリソースを配置する人はいません。


クラスがプラグインにあるパッケージにある場合、同じテストの出力は次のようになります。

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

したがって、フォルダツリーを上下に移動する必要があります。


最も興味深いのは、プラグインでパッケージがlaunchedである場合です。この例では、JUnitプラグインテストとして。出力は次のとおりです。

loaderDir = /C:.../ws/plugin/
 localDir = /package/

ここでは、both関数の結果のみを組み合わせた絶対パスを取得できます。そして、それだけでは十分ではありません。それらの間に、クラスパッケージがある場所のローカルパスを、プラグインフォルダーに対して相対的に配置する必要があります。おそらく、ここにsrcまたはsrc/test/resourceとして何かを挿入する必要があります。

コードをあなたのものに挿入して、あなたが持っているパスを見ることができます。

0
Gangnus

ファイルまたはファイルパスを返すには

URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath();  // return file path
0
eosimosu