java開發(fā)中,常見的resource文件有:.xml,.properties,.txt文件等,后臺開發(fā)中經(jīng)常用到讀取資源文件,處理業(yè)務(wù)邏輯,然后返回結(jié)果。
獲取資源文件的方法說明
getResource()返回:URL
getResourceAsStream () 返回的是inputstream,需要定義一個InputStream接收
//Class.getResource和Class.getResourceAsStream在使用時,路徑選擇上是一樣的。
相當于你用getResource()取得File文件后,再new InputStream(file)一樣的結(jié)果.
今天先了解一下如何讀取資源文件的URL。
以下圖的邏輯結(jié)構(gòu)為例:

有4種讀取文件URL的方法:
1.通過本類的class類的getResource方法
path不以’/'開頭時,默認是從此類所在的包下取資源;
path 以’/'開頭時,則是從ClassPath根下獲??;
// 同一個包下 URL url1 = ResourceTest.class.getResource("test1.xml"); System.out.println(url1.toString()); //輸出 file:/F:/kr-wyy/Studying/out/production/Studying/readFile/test1.xml//不同包下,用相對路徑 URL url2 = ResourceTest.class.getResource("/collection/test2.xml"); System.out.println(url2.toString()); //輸出:file:/F:/kr-wyy/Studying/out/production/Studying/collection/test2.xml//根目錄下 URL url3 = ResourceTest.class.getResource("/test3.xml"); System.out.println(url3.toString()); //輸出:file:/F:/kr-wyy/Studying/out/production/Studying/test3.xml/* 即: file:/F:/kr-wyy/Studying/out/production/Studying/readFile/test1.xml file:/F:/kr-wyy/Studying/out/production/Studying/collection/test2.xml file:/F:/kr-wyy/Studying/out/production/Studying/test3.xml*/
2、通過本類的ClassLoader的getResource方法
path不能以’/'開頭,path是從ClassPath根下獲?。?/span>
所以可以認為:類名.class.getResource("/") == 類名.class.getClassLoader().getResource("")
URL u1 = ResourceTest.class.getClassLoader().getResource("readFile/test1.xml");//同一個包下,還是要包名/文件名 System.out.println(u1); URL u2 = ResourceTest.class.getClassLoader().getResource("collection/test2.xml");//不同包下,要包名/文件名 System.out.println(u2); URL u3 = ResourceTest.class.getClassLoader().getResource("test3.xml");//根目錄下直接寫文件名 System.out.println(u3);
3、通過ClassLoader的getSystemResource(),路徑和2一致
URL r1 = ClassLoader.getSystemResource("readFile/test1.xml");//同一個包下,還是要包名/ System.out.println(r1); URL r2 = ClassLoader.getSystemResource("collection/test2.xml");//不同包下,要包名/文件名 System.out.println(r2); URL r3 = ClassLoader.getSystemResource("test3.xml");//根目錄下直接寫文件名 System.out.println(r3);
4、通過Thread方式,路徑和2一致(推薦此種),Thread.currentThread().getContextClassLoader()
為什么推薦此類?
Test.class.getClassLoader().getResource,因為你想要獲取某個資源文件的時候,這個資源文件的位置是相對固定的。
WEB程序,里面的jar、resources都是由Tomcat內(nèi)部來加載的,所以你在代碼中動態(tài)加載jar、資源文件的時候,首先應(yīng)該是使用Thread.currentThread().getContextClassLoader()。
如果你使用Test.class.getClassLoader(),可能會導致和當前線程所運行的類加載器不一致(因為Java天生的多線程)
URL l1=Thread.currentThread().getContextClassLoader().getResource("readFile/test1.xml"); System.out.println(l1); URL l2=Thread.currentThread().getContextClassLoader().getResource("collection/test2.xml"); System.out.println(l2); URL l3=Thread.currentThread().getContextClassLoader().getResource("test3.xml"); String l4=l3.getPath();//加上getPath()則去掉前面的file: System.out.println(l3); //file:/F:/kr-wyy/Studying/out/production/Studying/test3.xml System.out.println(l4);///F:/kr-wyy/Studying/out/production/Studying/test3.xml
另外,其他獲取資源文件路徑的有下面幾個:
// 獲取項目路徑 System.out.println(ResourceTest.class.getResource("").getPath());// /F:/kr-wyy/Studying/out/production/Studying/readFile/// 獲取根路徑 System.out.println(ResourceTest.class.getResource("/").getPath());// /F:/kr-wyy/Studying/out/production/Studying/ //獲取當前工程路徑 System.out.println(System.getProperty("user.dir"));// F:\kr-wyy\Studying// 獲取所有的類路徑 包括jar包的路徑 System.out.println(System.getProperty("java.class.path"));
上面的可以通過創(chuàng)建File文件,通過路徑來讀取文件內(nèi)容。
但是對于打包到j(luò)ar文件中的資源文件,則不能通過上面的getResource方法獲取了,但可以通過Class類的getResourceAsStream()方法來獲取
例如:resource打包成jar包,我們讀取里面的res.txt可如下,
/返回讀取指定資源的輸入流 InputStream is=this.getClass().getResourceAsStream("/resource/res.txt"); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String s=""; while((s=br.readLine())!=null) System.out.println(s); }
參考:
http://www.cnblogs.com/0616--ataozhijia/p/4094952.html
http://blog.csdn.net/zhoutaohenan/article/details/8467271