1. 程式人生 > >關於Class.getResource和ClassLoader.getResource的路徑問題(轉)

關於Class.getResource和ClassLoader.getResource的路徑問題(轉)

his control window 但是 是我 cto map -1 獲取

參考博客: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 [email protected] 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/com\cy\config\config.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/com\cy\config\config.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/com\cy\config\config.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/com\cy\config\config.xml
   }
}

註意的是:

1.                                        

this.getClass().getClassLoader().getResource("").getPath()中如果文件的路徑中有#空格等特殊字符的話,會轉義為%23等這樣的字符,得到的路徑就不正確

這時候要將特殊字符轉義,這是我在項目中遇到的:

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

2.File.separator:                                        

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

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

關於Class.getResource和ClassLoader.getResource的路徑問題(轉)