通过getResource()方法
在Java中通常使用Class.getResource(String path)
方法获取相关文件的URI,但使用的时候一定要注意参数。若以"/"开头,则路径以.class文件的最外层的包路径起始,否则均以.class文件当前所在目录起始。
下面举例说明。若文件结构如下:
/root
├─ /target
├─ /classes
├─ /foo
|- ├─ bar
|- |- ├─TestResource.class
├─ resource.png
则在TestResource类中使用如下方法返回值分别为:
TestResource.class.getResource("/").toString(); // 返回 file:/root/target/classes
TestResource.class.getResource("./").toString(); // 返回 file:/root/target/classes/foo/bar
TestResource.class.getResource("").toString(); // 返回 file:/root/target/classes/foo/bar
TestResource.class.getResource("/resource.png").toString();
// 返回 file:/root/target/classes/resource.png
TestResource.class.getResource("./resource.png").toString();
// 报NullPointerException,因为class文件同级目录下并无该文件
此处注意file为URL的Protocol,可以通过getProtocol()
方法获取,从而截去。若打包为jar包,则protocol为jar,其中的路径仍然还会包含file,如jar:file:/path/to/jar/xxx.jar!/fileName
。
通过new File()方法
还有一个小技巧就是可以通过新建一个文件对象(仅仅是文件对象,并不要求有该文件),来定位整个Project的根路径。
File temp = new File("");
System.out.println(temp.getAbsolutePath());
// 直接返回项目根路径,即 /root
若项目打包为jar,则路径就是jar包所在的路径。