Class.getResource()与Class.getClassLoader().getResource()解析
我們在eclipse上寫的.java文件最終會被編譯成一個.class的字節碼文件。而java源文件存儲在src文件下,而編譯后的.class字節碼文件存儲在bin文件下。
?一. 通過Class.getResource方法返回的是獲取文件或目錄的URL
public static void test1() throws Exception, FileNotFoundException{//本類名.class.getResource()//參數不帶任何路徑文件URL url=JDBCConnectin.class.getResource("");//參數帶一個"/"URL url2=JDBCConnectin.class.getResource("/");System.out.println(url); //file:/D:/java/javalianxi/javaproject/bin/yuan/JDBC/System.out.println(url2); // file:/D:/java/javalianxi/javaproject/bin/}可以看出:JDBCConnectin.class.getResource("");打印的是本類所在包目錄下的URL
file:/D:/java/javalianxi/javaproject/bin/yuan/JDBC/
而JDBCConnectin.class.getResource("/");打印的是字節碼class根目錄下的URL
file:/D:/java/javalianxi/javaproject/bin/
兩者的區別不言而喻,接下來訪問通過文件名訪問
public static void test1() throws Exception, FileNotFoundException{//本類名.class.getResource()//參數不帶/,代表的是該類所在的包目錄下;這樣可以直接訪問與該類同包的文件URL url=JDBCConnectin.class.getResource("123");//參數帶一個"/",代表的是根目錄下(bin目錄下);需要找到該文件的對于根目錄下的具體位置,才能訪問URL url2=JDBCConnectin.class.getResource("/yuan/JDBC/123");System.out.println(url); //file:/D:/java/javalianxi/javaproject/bin/yuan/JDBC/123System.out.println(url2);//file:/D:/java/javalianxi/javaproject/bin/yuan/JDBC/123}可以看出:參數不帶/,表示的是該類的所在的包目錄下;這樣可以直接訪問與該類同包的文件
而參數帶一個"/",表示的是根目錄下(bin目錄下);需要找到該文件的對于根目錄下的具體位置,才能訪問
?2. 通過ClassLoader.getResource方法獲取文件URL
其實就是多了一個getClassLoader(),比如JDBCConnectin.class.getClassLoader().getResource
ClassLoader.getResource方法參數同樣帶有一個String 類型的目錄參數,但ClassLoader.getResource方法參數不支持參數為"/",因為該實例方法返回的就是類所在的根目錄路徑。輸入帶"/"開頭的字符串,會返回null。參數輸入不帶“/”的字符串,則會返回class字節碼的根目錄下(bin目錄下),也可以相似理解為src目錄下
public static void test2() throws Exception, FileNotFoundException{ClassLoader cl=JDBCConnectin.class.getClassLoader();URL url=cl.getResource("");//獲取的是class根目錄file:/D:/java/javalianxi/javaproject/bin/String path=url.getPath();System.out.println(path);//D:/java/javalianxi/javaproject/bin/URL url2=cl.getResource("/");System.out.println(url2); //null}可以看出不帶“/”可以獲取的是class根目錄下,帶“/”就會打印null
public static void test() throws Exception, FileNotFoundException{ClassLoader cl=JDBCConnectin.class.getClassLoader();URL url=cl.getResource("yuan/JDBC/123");//獲取的是class根目錄:file:/D:/java/javalianxi/javaproject/bin/的urlString path=url.getPath();BufferedReader bf=new BufferedReader(new InputStreamReader(new FileInputStream(path),"utf-8"));int len=0;char[] bytes=new char[1024];while((len=bf.read(bytes))!=-1){System.out.println(new String(bytes,0,len));}System.out.println(url);System.out.println(url.toString());}如果把cl.getResource("yuan/usb/123")的參數換成"/yuan/usb/45"就會返回null.
最后:Class.getResource和ClassLoader.getResource的區別,就是在加載資源文件的時候,加載方式的不同,
class.getResource("/") == class.getClassLoader().getResource("")
其實,Class.getResource和ClassLoader.getResource本質上是一樣的,都是使用ClassLoader.getResource加載資源的。Class.getResource真正調用ClassLoader.getResource方法之前,會先獲取文件的路徑(path不以'/'開頭時,默認是從此類所在的包下取資源;path以'/'開頭時,則是從項目的ClassPath根下獲取資源)。
?
總結
以上是生活随笔為你收集整理的Class.getResource()与Class.getClassLoader().getResource()解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NC7-买卖股票的最好时机
- 下一篇: Exception: com.mchan