java - 相对路径说明

标签 java

项目文件系统:

Project
|
-----bin
|
 -----.settings
|
-----src
     |
     -----(default package)
          |
          -----Main.Java
          |
          -----neuropol x rg.ttf

我有一个程序可以设置如下字体:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT,
        getClass().getResourceAsStream("/neuropol x rg.ttf")));

效果很好。我想要弄清楚的是相对路径是如何工作的。因此,neuropol x rg.ttf 文件位于我的 src 文件夹中,因此为了正常工作,您会认为路径应该是:

...getResourcesAsStream("/src/neuropol x rg.ttf") 

但它工作得很好,就像我把它放在帖子顶部一样。据我了解,相对路径根应该是运行代码的位置,在本例中是我的项目文件夹,我通过在创建字体的正下方插入以下行来确认这一点:

System.out.println(System.getProperty("user.dir"));

该行返回项目文件夹。那么为什么它在不将 src 文件夹添加到路径的情况下工作呢?我对相对路径的根在哪里感到困惑吗?

最佳答案

方法getResourceAsStream()打开资源,而不是文件。资源可以是目录中的文件,也可以是 jar 文件中的条目或 JVM 可以找到资源的任何其他位置。 javadoc 讨论了 JVM 如何执行对指定资源的搜索。

关键点是资源名称是相对于 CLASSPATH 的,而不是相对于当前工作目录的。这就是为什么你不能在路径前加上“/src”前缀,尽管如果你要打开一个文件(例如“new FileInputStream(...)”),你会——但只有当程序从项目源运行时目录(但安装在用户计算机上时则不然)。

关于java - 相对路径说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36269114/

相关文章:

java - 使用Gradle将外部配置文件添加到jar

java - 具有重复规则的正则表达式

java - 由于 TLS 不兼容,SOAP Web 服务不接受请求

java - 如何使用 math.random 类生成随机整数

java - 如何在 JSP 中包含文件的转义版本

java - 创建一个范围从 X 天前到现在的随机纪元值

java - Beanshell XOR 抛出错误

java - 为什么原始数据类型的内存是固定的?

java - Spring XML 中的 "classpath:"和 "classpath:/"有什么区别?

java - 尝试比较两个对象并提取包含它们差异的第三个对象