java開發中,常見的resource文件有:.xml,.properties,.txt文件等,後臺開發中常常用到讀取資源文件,處理業務邏輯,而後返回結果。
獲取資源文件的方法說明
getResource()返回:URL
getResourceAsStream () 返回的是inputstream,須要定義一個InputStream接收
//Class.getResource和Class.getResourceAsStream在使用時,路徑選擇上是同樣的。
至關於你用getResource()取得File文件後,再new InputStream(file)同樣的結果.
今天先了解一下如何讀取資源文件的URL。
如下圖的邏輯結構爲例:
![](http://static.javashuo.com/static/loading.gif)
有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*/
二、經過本類的ClassLoader的getResource方法
path不能以’/'開頭,path是從ClassPath根下獲取;
因此能夠認爲:類名.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);
三、經過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);
四、經過Thread方式,路徑和2一致(推薦此種),Thread.currentThread().getContextClassLoader()
爲何推薦此類?
Test.class.getClassLoader().getResource,由於你想要獲取某個資源文件的時候,這個資源文件的位置是相對固定的。
WEB程序,裏面的jar、resources都是由Tomcat內部來加載的,因此你在代碼中動態加載jar、資源文件的時候,首先應該是使用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
另外,其餘獲取資源文件路徑的有下面幾個:html
// 獲取項目路徑
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"));
上面的能夠經過建立File文件,經過路徑來讀取文件內容。java
可是對於打包到jar文件中的資源文件,則不能經過上面的getResource方法獲取了,但能夠經過Class類的getResourceAsStream()方法來獲取 多線程
例如:resource打包成jar包,咱們讀取裏面的res.txt可以下,this
/返回讀取指定資源的輸入流 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.htmlhttp://blog.csdn.net/zhoutaohenan/article/details/8467271