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


95

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

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

Javaで、ファイルへの絶対パスを取得するにはどうすればよいですか?


Mavenプラグインを作成しますか?または、プログラムの実行時にファイルにアクセスしますか?
ジャイロギアレス2013年


ソリューションの3つの変形は、状況に応じて、ありますstackoverflow.com/a/56327069/715269
Gangnus

回答:


73

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

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

または

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

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

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

8
作業ディレクトリがmavenルートであることに依存しているため、限定的な使用のアドバイス。それでも、target/classes/abc.txtMavenが処理後にリソースファイルを配置する標準的な場所であるため、ファイルを参照するために使用する必要があります(たとえば、maven-resourcesプラグインがabc.txtでプロパティ置換を行った可能性があります)。クラスパスからgetResource()を介してabc.txtを使用することをお勧めします。
ジャイロギアレス2013年

2
エンドユーザーがアプリケーションを実行可能JARとして実行している場合はどうなりますか?そうすると、物理ファイルはまったく存在しなくなります。これは、getResource()を使用する必要があるもう一つの理由です。たとえば、getResource()で何をしたいかに応じて、入力ストリームを開きます。
マシューワイズ

6
これを正解として削除できますか?@Karol Sは以下に答えました-それは正しい答えであるはずです(したがって、
賛成の

3
間違った答え。@Karolで答え以下を参照してください
bhathiya-ペレラ

167

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

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

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

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


5
または、おそらく次のことを実行できます:(new File(resource.toURI()).getAbsolutePath();つまり、Pathオブジェクトは必要ないと思いますか?)
Dan King

1
toURI()に関する良いヒントです。これにより、パス内のスペースが%20として出力されるのを防ぐことができます。
マシューワイズ

29
ありがとう!これはほとんど私のために働いた。しかし、私は1つの変更を加える必要がありました:YourClass.class.getClassLoader()。getResource( "abc");
yngwietiger 2015

必要にnew File(YourClass.class.getResource("abc").toURI().getPath())応じて、別の方法で行うこともできます。
マイクライランダー2017年

2
私はこれが開始スラッシュなしでこれほど多くの人々のために働いているか理解していない:.getResource("/abc")
cahen

28

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

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

12

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

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

1

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

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

絶対パスに向かう途中に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/

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


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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.