项目文件系统:
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文件夹添加到路径中呢?我对相对路径的根位置感到困惑吗?
答案 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")