最近在做一个web项目,后台的service层需要调用某些资源文件,那么问题来了:如何调用指定文件夹下的资源?能够挪用java独立程序的获取相对路径的方式来获取web项目程序的相对路径?

1、J2SE应用程序

这种程序,最典型的代表,就是java语言初学者都会碰到的hello world程序。

eg:

java 运行时相对路径 java项目相对路径_J2EE相对路径

 

上图中名为"CSVTest"的程序,就属于J2SE的类型,通常有一个main函数,也是程序的起始入口。这种类型程序的层次结构就是图中所表达的树状层次结构。

那么,若要得到绝对路径,eg:

String path = "D:/workspace/CSVTest/ss.csv";

 

 

这种情况下,J2SE应用程序或者web项目程序,都可以直接使用绝对路径,这个没有问题,但是,大多数时候,特别是web项目程序,考虑到后期的程序移植性,都会使用相对路径,即使程序换了个存储位置或者机器,都不用再去修改资源的路径,就节省了很多人工成本,提高了效率,所以本文中主要介绍相对路径的获取方式。

 

 

在J2SE应用程序中,有以下几种方式获得相对路径:

 

  • "./"方式:

 


 

String filePath = "./";   //如果路径是 "./xxx.csv"的形式,那么文件被保存在项目的根目录下

 

 

这种方式下,可以获得项目的根目录,例如,如果放在"CSVTest"程序中,就是表示CSVTest的根目录:

java 运行时相对路径 java项目相对路径_ClassPath的绝对URL路径的获取_02

 

注意:

这种方式不适合在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、总结

 

 

  1. 尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径;
  2. 在项目中,特别是J2EE程序中,尽量使用基于ClassPath的相对路径,避免使用绝对路径,否则不利于移植;
  3. 不要在程序中给出某个资源的绝对路径,因为可以用getResounce("")的方式得到当前路径,也就是一行代码的事情,不要嫌麻烦,知道了就很简单,不知道的话,简单看一下,也就明白了,这也能避免以后更大的麻烦。
  4. 最后,还是要说一句:尽量用ClassPath的绝对路径来拼接你要访问的所以资源的路径。
  5. URL转为file格式:url.getFile(); 转为字符串。
  6. 另外,在J2EE中,.项目是在
D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

  1. 这个目录下的,比如:

    EVM项目就是在tomcat的一系列路径下。
    而这个时候,部署在服务器端的代码,在运用上述方式获取相对路径时,得到的也是该目录下的ClassPath路径。
/D:/Program Files/tomcat7.0/webapps/EVM/asserts/EVMTable/companyAssessment/