关于Class.getResource和ClassLoader.getResource的路径问题(转)

参考博客:http://www.cnblogs.com/yejg1212/p/3270152.html

Class.getResource(String path)

当path以/开头,如/a/b/c.properties时,查找的路径为: classpath路径:path。
当path不以/开头时,如c.properties,查找的路径为:当前调用类的路径:path。

什么意思呢?看下面这段代码的输出结果就明白了:

package testpackage;
public class TestMain {
    public static void main(String[] args) {
        System.out.println(TestMain.class.getResource(""));
        System.out.println(TestMain.class.getResource("/"));
    }
}

输出结果:
file:/E:/workspace/Test/bin/testpackage/
file:/E:/workspace/Test/bin/

※Class.getResource和Class.getResourceAsStream在使用时,路径选择上是一样的。

Class.getClassLoader().getResource(String path)

path不能以’/'开头时;
path是从ClassPath根下获取;
package testpackage;
public class TestMain {
    public static void main(String[] args) {
        TestMain t = new TestMain();
        System.out.println(t.getClass());
        System.out.println(t.getClass().getClassLoader());
        System.out.println(t.getClass().getClassLoader().getResource(""));
        System.out.println(t.getClass().getClassLoader().getResource("/"));//null
    }
}

//输出结果:
class testpackage.TestMain
sun.misc.Launcher$AppClassLoader@1fb8ee3
file:/E:/workspace/Test/bin/
null

※Class.getClassLoader().getResource和Class.getClassLoader().getResourceAsStream在使用时,路径选择上也是一样的。

但是我做的实验下面:getClassLoader().getResource("/")也是行的,为什么呢?

在TestController中想要获取com/cy/config包下面的config.xml文件:

@Controller 
public class TestController {
    
  private static Logger logger = (Logger) LoggerFactory.getLogger(TestController.class);
    
  @RequestMapping("/test")
  public void test(HttpServletRequest request){
   String path = this.getClass().getResource("/").getPath() + "com"+File.separator+"cy"+File.separator+"config"+File.separator+"config.xml";
   System.out.println(path);
   // /D:/tomcat8.5.9/webapps/springMVC/WEB-INF/classes/comcyconfigconfig.xml
        
   String path2 = this.getClass().getResource("").getPath() + "com"+File.separator+"cy"+File.separator+"config"+File.separator+"config.xml";
   System.out.println(path2);
   // /D:/tomcat8.5.9/webapps/springMVC/WEB-INF/classes/com/cy/controller/comcyconfigconfig.xml
        
   String path3 = this.getClass().getClassLoader().getResource("/").getPath() + "com"+File.separator+"cy"+File.separator+"config"+File.separator+"config.xml";
   System.out.println(path3);
   // /D:/tomcat8.5.9/webapps/springMVC/WEB-INF/classes/comcyconfigconfig.xml
        
   String path4 = this.getClass().getClassLoader().getResource("").getPath() + "com"+File.separator+"cy"+File.separator+"config"+File.separator+"config.xml";
   System.out.println(path4);
   // /D:/tomcat8.5.9/webapps/springMVC/WEB-INF/classes/comcyconfigconfig.xml
   }
}

 注意的是:

1.                                        

this.getClass().getClassLoader().getResource("").getPath()中如果文件的路径中有#空格等特殊字符的话,会转义为%23等这样的字符,得到的路径就不正确

这时候要将特殊字符转义,这是我在项目中遇到的:

URLDecoder.decode(path, "UTF-8")  

2.File.separator:                                        

File.separator: 是系统分隔符,比如windows下面文件路径的分隔符是""; linux下面是"/"

但是在windows下面和linux下面都可以用"/"


原文地址:https://www.cnblogs.com/tenWood/p/6838966.html