J2EE中的資源文件的加載

5.1. 資源概述

5.1.1. 什麼是資源?

在一個稍具規模的應用程序中,經常要做的一件事,就是查找資源、讀取資源的內容。這裏所謂的“資源”,是指存放在某一介質中,可以被程序利用的文件、數據。例如,基於Java的WEB應用中,常用到下面的資源:

  • 配置文件:*.xml*.properties等。

  • Java類文件:*.class

  • JSP頁面、Velocity模板文件:*.jsp*.vm等。

  • 圖片、CSS、JavaScript文件:*.jpg*.css*.js等。

5.1.2. 如何表示資源?

在Java中,有多種形式可以表示一個資源:

表 5.1. 資源的表示

可表示資源的對象 說明
java.io.​File

可代表文件系統中的文件或目錄。例如:

  • 文件系統中的文件:“c:\config.sys”。

  • 文件系統中的目錄:“c:\windows\”。

java.net.​URL

統一資源定位符。例如:

  • 文件系統中的文件:c:\config.sys,可以表示成URL:“file:///c:/config.sys”。

  • 文件系統中的目錄:c:\windows\,可以表示成URL:“file:///c:/windows/”。

  • 遠程WEB服務器上的文件:“http://www.springframework.org/schema/beans.xml”。

  • Jar包中的某個文件,可以表示成URL:“jar:file:///c:/my.jar!/my/file.txt”。

java.io.​InputStream

輸入流對象,可用來直接訪問資源的內容。例如:

  • 文件系統中的文件:c:\config.sys,可以用下面的代碼來轉換成輸入流:

    new FileInputStream("c:\\config.sys");
  • 遠程WEB服務器上的文件,可以用下面的代碼來轉換成輸入流:

    new URL("http://www.springframework.org/schema/beans.xml")​.openStream();
  • Jar包中的某個文件,可以用下面的代碼來轉換成輸入流:

    new URL("jar:file:///c:/my.jar!/my/file.txt")​.openStream();

然而,並不是所有的資源,都可以表現成上述所有的形式。比如,

  • Windows文件系統中的目錄,無法表現爲輸入流。

  • 而遠程WEB服務器上的文件無法轉換成File對象。

  • 多數資源都可以表現成URL形式。但也有例外,例如,如果把數據庫中的數據看作資源,那麼一般來說這種資源無法表示成URL

5.1.3. 如何訪問資源?

不同類型的資源,需要用不同的方法來訪問。

訪問CLASSPATH中的資源

將資源放在CLASSPATH是最簡單的做法。我們只要把所需的資源文件打包到Jar文件中,或是在運行java時,用-classpath參數中指定的路徑中。接下來我們就可以用下面的代碼來訪問這些資源:

例 5.1. 訪問CLASSPATH中的資源

URL resourceURL = getClassLoader().getResource("java/lang/String.class"); // 取得URL
InputStream resourceContent = getClassLoader().getResourceAsStream("java/lang/String.class"); // 取得輸入流
訪問文件系統中的資源

下面的代碼從文件資源中讀取信息:

例 5.2. 訪問文件系統中的資源

File resourceFile = new File("c:\\test.txt"); // 取得File
InputStream resourceContent = new FileInputStream(resourceFile); // 取得輸入流
訪問Web應用中的資源

Web應用既可以打包成war文件,也可以展開到任意目錄中。因此Web應用中的資源(JSP、模板、圖片、Java類、配置文件)不總是可以用文件的方式存取。雖然Servlet API提供了ServletContext.getRealPath()方法,用來取得某個資源的實際文件路徑,但該方法很可能返回null —— 這取決於應用服務器的實現,以及Web應用的佈署方式。更好的獲取WEB應用資源的方法如下:

例 5.3. 訪問Web應用中的資源

URL resourceURL = servletContext.getResource("/WEB-INF/web.xml"); // 取得URL
InputStream resourceContent = servletContext.getResourceAsStream("/WEB-INF/web.xml"); // 取得輸入流
訪問Jar/Zip文件中的資源

下面的代碼讀取被打包在Jar文件中的資源信息:

例 5.4. 訪問Jar/Zip文件中的資源

URL jarURL = new File(System.getProperty("java.home") + "/lib/rt.jar").toURI().toURL();
URL resourceURL = new URL("jar:" + jarURL + "!/java/lang/String.class"); // 取得URL
InputStream resourceContent = resourceURL.openStream(); // 取得輸入流
訪問其它資源

還可以想到一些訪問資源的方法,例如從數據庫中取得資源數據。

發佈了49 篇原創文章 · 獲贊 30 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章