首先:
資源文件分兩種:后綴.xml文件和.properties文件
.xml文件:當數據之間有聯系時用.xml
.properties文件:當數據之間沒有聯系時用.properties
正題:
java代碼讀取資源文件
一般我們所寫的java代碼是在src的包下,因為src包下的文件、類等最終都會發布到WEB-INF/classes目錄下去,這些類要能夠被服務器調用,首先要被類裝載器裝載,同樣的類裝載器也可以裝載資源文件。
下列舉例是讀取連接數據庫的資源文件:
代碼:
servlet中的代碼:
public class servletDemo11 extends HttpServlet { //servlet調用其他程序,在其他程序中如何讀取資源文件 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { UserDao dao = new UserDao(); dao.update(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
被調用的Java程序中的代碼1:
1 //由servletDemo11調用 2 public class UserDao { 3 4 public void update() throws IOException{ 5 //getClassLoader():加載類加載器 之后返回一個類加載器 6 InputStream in = UserDao.class.getClassLoader().getResourceAsStream("1.properties"); 7 Properties p = new Properties(); 8 p.load(in); 9 String url = p.getProperty("url"); 10 System.out.println(url); 11 }
在實際開發中:有增刪改查一系列操作,加上資源文件只讀取一次,所以需要把讀取資源文件的代碼抽出來放到靜態代碼塊中去
代碼如下:
被調用的Java程序中的代碼2:
1 //由servletDemo11調用 2 public class UserDao { 3 private static Properties p = new Properties(); 4 static{ 5 //此時1.properties在src下 6 InputStream in = UserDao.class.getClassLoader().getResourceAsStream("WEB-INF/classes/1.properties"); 7 try { 8 p.load(in); 9 } catch (IOException e) { 10 //因為現在是要連接數據庫,連接過程出現了異常就連接不上,所以直接拋出來一個錯誤Error 11 throw new ExceptionInInitializerError(); 12 } 13 14 } 15 16 public void update() throws IOException{ 17 System.out.println(p.getProperty("url")); 18 } 19 }
需要注意:
通過類加載器加載資源文件時,資源文件不能過大。在裝載大的資源文件時,類加載器和平時加載類一樣把文件夾到內存中去,java虛擬機很可能會因為內存溢出而崩潰。
這里還有一個實際開發中會遇到的問題:
當在服務器運行過程中把資源文件進行改動后,再次進行訪問,訪問的數據會不會變?
答案是不會。
原因是:類加載器只加載一次,內存中已經裝載過了,所以不會變。
現在要想訪問改動后的資源文件,解決辦法有兩個:
1、重新啟動服務器,再次訪問,但這不符合實際開發的設計思想,僅供個人實踐;
2、用傳統方式去讀(因為類加載器只能加載一次,所以通過類加載器是訪問不了的,但又因為傳統方式需要文件的路徑,所以可以通過類加載器獲取文件路徑,之后通過傳統方式去讀)
傳統方式代碼如下:
1 public void update() throws IOException{ 2 3 //getResource():查找具有給定名稱的資源。並返回它的URL地址 4 //getPath():獲取此 URL 的路徑部分。 5 String str = UserDao.class.getClassLoader().getResource("/WEB-INF/classes/1.properties").getPath(); 6 //傳統方式讀,傳統方式里需要文件的路徑為:相對於Java虛擬機的路徑 7 FileInputStream in = new FileInputStream(str); 8 Properties p = new Properties(); 9 p.load(in); 10 String url = p.getProperty("url"); 11 System.out.println(url); 12 }
此時,請注意我的上一段代碼,getResource方法里面的地址寫的是"/WEB-INF/classes/1.properties",聲明一下,我的1.properties是在src下,此時會出現一個問題,當你訪問servletDemo11時可能會出現拋空指針異常的情況.。
因為存web應用的位置和eclipse文件的位置沖突了,比如我的eclipse在D盤下,tomact的webapps在C盤下,此時要保證C盤下的WEB-INF/classes和D盤下的src下都要有1.properties,才可以進行下一步操作,訪問資源還是修改訪問后的資源,都不影響
此時問題就解決了。