假设标准的maven设置。假设在资源文件夹中有一个文件abc。在Java中,如何获得文件的绝对路径?
abc
6ojccjat1#
正确的方法是:
URL resource = YourClass.class.getResource("abc"); Paths.get(resource.toURI()).toFile();
字符串现在文件在类路径中的物理位置并不重要,只要资源实际上是一个文件而不是一个目录项,就可以找到它。(The看起来很明显new File(resource.getPath())并不适用于所有路径!路径仍然是URL编码的!)
new File(resource.getPath())
erhoui1w2#
您可以使用ClassLoader.getResource方法来获取正确的资源。
ClassLoader.getResource
URL res = getClass().getClassLoader().getResource("abc.txt"); File file = Paths.get(res.toURI()).toFile(); String absolutePath = file.getAbsolutePath();
字符串或虽然这可能并不总是有效,但一个更简单的解决方案-你可以创建一个File对象并使用getAbsolutePath方法:
File
getAbsolutePath
File file = new File("resources/abc.txt"); String absolutePath = file.getAbsolutePath();
型
b91juud33#
您需要指定从/开始的路径
/
URL resource = YourClass.class.getResource("/abc"); Paths.get(resource.toURI()).toFile();
字符串
eiee3dmh4#
创建你需要的类的classLoader示例,然后你可以很容易地访问文件或资源。现在你使用该类的getPath()方法访问路径。
getPath()
ClassLoader classLoader = getClass().getClassLoader(); String path = classLoader.getResource("chromedriver.exe").getPath(); System.out.println(path);
cld4siwp5#
在我们通往绝对道路的路上有两个问题:1.找到的位置将不是源文件所在的位置,而是类保存的位置。资源文件夹几乎肯定会位于项目的源文件夹中的某个位置。1.如果类直接在工作区中的插件或包中运行,则用于检索资源的相同函数的工作方式不同。下面的代码将给予我们所有有用的路径:
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中运行的代码将打印:
class
loaderDir = /C:.../ws/source.dir/target/test-classes/ localDir = /C:.../ws/source.dir/target/test-classes/package/
型所以,要到达src/rest/resources,我们应该在文件树中上下移动。两种方法都可以使用。注意,我们不能使用getResource(resourceFolderName),因为该文件夹不在目标文件夹中。我希望没有人会将资源放在创建的文件夹中。如果类在插件中的包中,则同一测试的输出将是:
getResource(resourceFolderName)
loaderDir = /C:.../ws/plugin/bin/ localDir = /C:.../ws/plugin/bin/package/
型因此,我们应该再次上下查看文件夹树。最有趣的是当包在插件中 * 启动 * 时的情况。作为JUnit插件测试,对于我们的示例。输出是:
loaderDir = /C:.../ws/plugin/ localDir = /package/
型在这里,我们可以得到绝对路径只结合 both 函数的结果。这是不够的。在它们之间,我们应该把类包所在的地方的本地路径,相对于插件文件夹。可能,你将不得不在这里插入src或src/test/resource。您可以将代码插入到您的代码中,并查看您拥有的路径。
src
src/test/resource
jchrr9hc6#
返回文件或文件路径
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
4ktjp1zp7#
这对我来说很有效:
try { java.net.URL YourClassDir = YourClass.class.getResource("YourClass.class"); String YourClassActionDirStr = YourClassDir.toString(); System.out.println(YourClassActionDirStr); } catch (Exception e) { System.out.println(e); }
字符串结果:文件:/C:/...目录
7条答案
按热度按时间6ojccjat1#
正确的方法是:
字符串
现在文件在类路径中的物理位置并不重要,只要资源实际上是一个文件而不是一个目录项,就可以找到它。
(The看起来很明显
new File(resource.getPath())
并不适用于所有路径!路径仍然是URL编码的!)erhoui1w2#
您可以使用
ClassLoader.getResource
方法来获取正确的资源。字符串
或
虽然这可能并不总是有效,但一个更简单的解决方案-
你可以创建一个
File
对象并使用getAbsolutePath
方法:型
b91juud33#
您需要指定从
/
开始的路径字符串
eiee3dmh4#
创建你需要的类的classLoader示例,然后你可以很容易地访问文件或资源。现在你使用该类的
getPath()
方法访问路径。字符串
cld4siwp5#
在我们通往绝对道路的路上有两个问题:
1.找到的位置将不是源文件所在的位置,而是类保存的位置。资源文件夹几乎肯定会位于项目的源文件夹中的某个位置。
1.如果类直接在工作区中的插件或包中运行,则用于检索资源的相同函数的工作方式不同。
下面的代码将给予我们所有有用的路径:
字符串
这里研究了两种可以用于资源文件夹本地化的函数,对于
class
,它可以通过静态或动态的方式获取。如果项目不在插件中,则在JUnit中运行的代码将打印:
型
所以,要到达src/rest/resources,我们应该在文件树中上下移动。两种方法都可以使用。注意,我们不能使用
getResource(resourceFolderName)
,因为该文件夹不在目标文件夹中。我希望没有人会将资源放在创建的文件夹中。如果类在插件中的包中,则同一测试的输出将是:
型
因此,我们应该再次上下查看文件夹树。
最有趣的是当包在插件中 * 启动 * 时的情况。作为JUnit插件测试,对于我们的示例。输出是:
型
在这里,我们可以得到绝对路径只结合 both 函数的结果。这是不够的。在它们之间,我们应该把类包所在的地方的本地路径,相对于插件文件夹。可能,你将不得不在这里插入
src
或src/test/resource
。您可以将代码插入到您的代码中,并查看您拥有的路径。
jchrr9hc6#
返回文件或文件路径
字符串
4ktjp1zp7#
这对我来说很有效:
字符串
结果:
文件:/C:/...目录