WEB應用中普通java代碼如何讀取資源文件


首先

  資源文件分兩種:后綴.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,才可以進行下一步操作,訪問資源還是修改訪問后的資源,都不影響

 

此時問題就解決了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM