2016-03-28 49 views
0

项目文件系统:相对路径澄清

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文件夹添加到路径的情况下工作呢?我困惑于相对路径的根源在哪里?

+0

当你的代码被编译时,src /'文件夹不再存在。 –

回答

3

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

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

+0

这两个真棒的答案。谢谢! – user3226170

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")