標準のMavenセットアップを想定します。
リソースフォルダにファイルがあるとしましょうabc
。
Javaで、ファイルへの絶対パスを取得するにはどうすればよいですか?
標準のMavenセットアップを想定します。
リソースフォルダにファイルがあるとしましょうabc
。
Javaで、ファイルへの絶対パスを取得するにはどうすればよいですか?
回答:
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();
target/classes/abc.txt
Mavenが処理後にリソースファイルを配置する標準的な場所であるため、ファイルを参照するために使用する必要があります(たとえば、maven-resourcesプラグインがabc.txtでプロパティ置換を行った可能性があります)。クラスパスからgetResource()を介してabc.txtを使用することをお勧めします。
実際に機能する適切な方法:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
クラスパス内のファイルが物理的にどこにあるかは問題ではありません。リソースが実際にファイルであり、JARエントリでない限り、ファイルは検出されます。
(一見明らかなように見えるのnew File(resource.getPath())
は、すべてのパスで機能するわけではありません!パスはまだURLエンコードされています!)
new File(resource.toURI()).getAbsolutePath();
つまり、Pathオブジェクトは必要ないと思いますか?)
new File(YourClass.class.getResource("abc").toURI().getPath())
応じて、別の方法で行うこともできます。
.getResource("/abc")
ファイルまたはファイルパスを返すには
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
絶対パスに向かう途中に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
ここに何かを挿入する必要があります。
あなたはあなたのコードを挿入して、あなたが持っているパスを見ることができます。