相对路径澄清

时间:2016-03-28 18:58:11

标签: 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") 

但它在帖子的顶部以我的方式工作正常。根据我的理解,相对路径root应该是代码运行的地方,在这种情况下是我的项目文件夹,我通过在创建字体的下方插入以下行来确认:

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

此行返回项目文件夹。那么为什么没有将src文件夹添加到路径中呢?我对相对路径的根位置感到困惑吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

src只是项目的包结构,在编译时不包含在内。如果您没有导致您使用(Default package)的软件包名称,则会发生/yourFont.ttf。例如,如果您有一个包名称:

-----src
     |
     -----yourpackage
          |    
          -----neuropol x rg.ttf
// This will become getResourceAsStream("/yourpackage/neuropol x rg.ttf")

-----src
     |
     -----yourpackage
          | 
          -----Main.java
          |    
          -----fonts
               |
               -----neuropol x rg.ttf
// This will become getResourceAsStream("/yourpackage/fonts/neuropol x rg.ttf")
相关问题