zoukankan      html  css  js  c++  java
  • 关于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下面都可以用"/"

    
    
  • 相关阅读:
    python读取数据写入excel
    English Study!
    ODOO里视图开发案例---定义一个像tree、form一样的视图
    更改gradle中央仓库,加快访问速度
    hadoop解决集群启动时某个slave的datanode挂掉问题
    ssh免密登录
    大数据集群脚本xcall和xsync
    虚拟机启动后黑屏并无法关闭
    快照与克隆的区别(来自转载)
    VMware12 打不开Centos6.8系统
  • 原文地址:https://www.cnblogs.com/tenWood/p/6838966.html
Copyright © 2011-2022 走看看