在Java中获取文件路径

10

Java程序有办法确定自己在文件系统中的位置吗?

3个回答

13
你可以使用 CodeSource#getLocation() 方法来实现这个功能。通过 ProtectionDomain#getCodeSource() 方法可以获取到相应的 CodeSource 对象。而获取 ProtectionDomain 对象则需要使用 Class#getProtectionDomain() 方法。
URL location = getClass().getProtectionDomain().getCodeSource().getLocation();
File file = new File(location.getPath());
// ...

这将返回所查询的Class的确切位置。

更新:根据评论,它似乎已经在类路径中。您可以直接使用ClassLoader#getResource()方法,并传递相对于根包的路径。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL resource = classLoader.getResource("filename.ext");
File file = new File(resource.getPath());
// ...

你甚至可以使用ClassLoader#getResourceAsStream(),将其作为InputStream获取。

InputStream input = classLoader.getResourceAsStream("filename.ext");
// ...

这也是使用打包资源的正常方式。如果它位于一个包内,那么可以使用 com/example/filename.ext,例如。


1
+1,但请注意ProtectionDomain.getCodeSource()和CodeSource.getLocation()都可能为空。 - Brett Kail
@bkail:当使用一个设计不良的自制类加载器或从某些外部流源加载时,它确实可能返回null。然而,这通常不适用于具有main()的“具体”Java程序。 - BalusC
这确实可以完成任务,但看起来不太好。我需要做的是加载一个配置文件,该文件需要与我的jar文件在同一文件夹中,但可以从任何位置运行。这是获取文件位置信息的正确方法吗? - markovuksanovic
1
getResourceAsStream建议是一个好的选择。顺便说一下,getResource将返回"jar:file:path!/resource",因此您需要在传递给File之前对其进行拆解。即使您假设基于目录的类路径,从getResource获取的URL.getPath()也将被URL编码(例如,“Program%20Files”),因此您需要在转换为文件之前解码(或仅将URL转换为URI)。 (很抱歉我这么啰嗦;我在类加载器支持方面工作了三年,亲身体验了所有这些细微差别带来的痛苦:-))。 - Brett Kail
我曾经在一个OSGi bundle中看到CodeSource.getLocation()返回null,因此它不一定是由于“设计不良”的类加载器引起的。 - David G
显示剩余3条评论

0

-1

如果您想获取当前运行程序的“工作目录”,则只需使用:

new File("");

2
工作目录不一定是程序所在的位置。 - Douglas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接