更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~
最近在做一个web项目,后台的service层需要调用某些资源文件,那么问题来了:如何调用指定文件夹下的资源?能够挪用java独立程序的获取相对路径的方式来获取web项目程序的相对路径?
1、J2SE应用程序
这种程序,最典型的代表,就是java语言初学者都会碰到的hello world程序。
eg:
上图中名为"CSVTest"的程序,就属于J2SE的类型,通常有一个main函数,也是程序的起始入口。这种类型程序的层次结构就是图中所表达的树状层次结构。
那么,若要得到绝对路径,eg:
String path = "D:/workspace/CSVTest/ss.csv";
这种情况下,J2SE应用程序或者web项目程序,都可以直接使用绝对路径,这个没有问题,但是,大多数时候,特别是web项目程序,考虑到后期的程序移植性,都会使用相对路径,即使程序换了个存储位置或者机器,都不用再去修改资源的路径,就节省了很多人工成本,提高了效率,所以本文中主要介绍相对路径的获取方式。
在J2SE应用程序中,有以下几种方式获得相对路径:
- "./"方式:
String filePath = "./"; //如果路径是 "./xxx.csv"的形式,那么文件被保存在项目的根目录下
这种方式下,可以获得项目的根目录,例如,如果放在"CSVTest"程序中,就是表示CSVTest的根目录:
注意:
这种方式不适合在web项目程序中,会提示找不到路径。因为:对于一般的程序,这种方式获得的就是项目的根目录,但是在J2EE程序中,有可能是
服务器的某一个路径,这里并没有统一的规范。所以,安全起见,在J2EE项目程序中,不要使用这种方式即可,况且,J2EE中可替代的方式也有很多滴。
- ReadCSV.class.getResource(""); 其中,ReadCSV是代码所在的类名。
eg:
System.out.println(ReadCSV.class.getResource(""));
就会得到如下结果:
file:/D:/workspace/CSVTest/bin/
而getResource("")中可以加入"/"符号,getResource("/"),会得到同样的结果。但是,不能使用"../",这是返回上一级的意思,但是在这种情况下不能使用,否则会得到null。
- Thread.currentThread().getContextClassLoader().getResource("")
这种方式和上一种方式差不多,都会得到相同的结果。唯一不同的是:该方式中不能加入"/",否则会得到null。
- ReadCSV.class.getClassLoader().getResource("")
该方法和 上一个Thread的那个一样,也不能加"/"。
- ClassLoader.getSystemResource("")
同以上两个方法,得到当前项目的ClassPath的绝对路径。也不能加"/"。
2、J2EE程序
主要有以下几种获取相对路径的方式:
- ChartsService.class.getResource(""),其中,ChartsService是类名。
得到如下结果:
file:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/EVM/WEB-INF/classes/com/sac/evm/service/
说明:获得当前的classPath的绝对URL路径,若加入"../"则是返回上一级目录,可重复使用。这也是不同于J2SE应用程序的地方,可以返回到上一级,或者上上级,这取决于"../"的个数。
- ChartsService.class.getResource("/"); //获取当前文件的绝对路径,路径中不包括该文件自己
结果如下:
file:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/EVM/WEB-INF/classes/
注意:该路径和上一个的路径不同之处,本结果中是当前ClassPath的绝对URL路径。本方式也可以多次使用"../"。
- ChartsService.class.getClassLoader().getResource("");
获得结果和上一种方式相同,可多次使用"../"。
- Thread.currentThread().getContextClassLoader().getResource("");
同上一种方式,可多次使用"../"。
比如:
URL url = Thread.currentThread().getContextClassLoader().getResource("../../");
System.out.println(url);
String path = url.getFile() + "asserts/EVMTable/companyAssessment/项目指标.csv";
System.out.println(path);
System.out.println("呵呵");
以上几行代码中,就是以ClassPath的路径为基准,再得到其他路径下的资源。
3、总结
- 尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径;
- 在项目中,特别是J2EE程序中,尽量使用基于ClassPath的相对路径,避免使用绝对路径,否则不利于移植;
- 不要在程序中给出某个资源的绝对路径,因为可以用getResounce("")的方式得到当前路径,也就是一行代码的事情,不要嫌麻烦,知道了就很简单,不知道的话,简单看一下,也就明白了,这也能避免以后更大的麻烦。
- 最后,还是要说一句:尽量用ClassPath的绝对路径来拼接你要访问的所以资源的路径。
- URL转为file格式:url.getFile(); 转为字符串。
- 相关链接:http://blog.csdn.net/yethyeth/article/details/1623283
- 相关链接:http://blog.csdn.net/linjx2004/article/details/5608909
- 另外,在J2EE中,.项目是在
D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
这个目录下的,比如:
EVM项目就是在tomcat的一系列路径下。
而这个时候,部署在服务器端的代码,在运用上述方式获取相对路径时,得到的也是该目录下的ClassPath路径。
而对于该项目下的资源,都可依赖ClassPath这个绝对路径来拼凑出相对路径。/D:/Program Files/tomcat7.0/webapps/EVM/asserts/EVMTable/companyAssessment/
更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~