關於Class.getResource和ClassLoader.getResource的路徑問題(轉)
阿新 • • 發佈:2017-05-11
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的路徑問題(轉)