假设标准 Maven 设置。
说在您的资源文件夹中有一个文件abc
。
在Java中,我怎样才能获得文件的绝对路径?
实际工作的正确方法:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
现在类路径中文件的物理位置无关紧要,只要资源实际上是文件而不是 JAR 条目,就会找到它。
(看似显而易见的new File(resource.getPath())
方法并不适用于所有路径!路径仍然是 URL 编码的!)
您可以使用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();
您需要指定路径开始于/
URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();
创建您需要的类的 classLoader 实例,然后您可以轻松访问文件或资源。现在您使用getPath()
该类的方法访问路径。
ClassLoader classLoader = getClass().getClassLoader();
String path = classLoader.getResource("chromedriver.exe").getPath();
System.out.println(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/
在这里,我们可以只结合两个函数的结果来获得绝对路径。这还不够。在它们之间,我们应该放置类包所在位置的本地路径,相对于插件文件夹。src
可能,您将不得不在src/test/resource
此处插入一些内容。
您可以将代码插入您的代码并查看您拥有的路径。
返回文件或文件路径
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