日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Class.getResource()与Class.getClassLoader().getResource()解析

發布時間:2024/9/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。