假设标准的Maven设置。
说在您的资源文件夹中,您有一个文件abc
。
在Java中,如何获取文件的绝对路径?
假设标准的Maven设置。
说在您的资源文件夹中,您有一个文件abc
。
在Java中,如何获取文件的绝对路径?
Answers:
您可以使用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
通往绝对路径的过程中存在两个问题:
以下代码将为我们提供所有有用的路径:
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/
在这里,我们仅将两个函数的结果组合即可获得绝对路径。这还不够。在它们之间,我们应该放置类包所在位置的本地路径,相对于plugin文件夹。可能您将不得不在src
或src/test/resource
此处插入一些内容。
您可以将代码插入自己的代码中,并查看您拥有的路径。